圖的鄰接表存儲及其實現

圖的鄰接矩陣存儲雖然直觀,但是我們容易發現其浪費空間的問題十分嚴重。在線性表中,我們引入鏈式存儲結構來彌補空間浪費的問題,同樣,在圖結構中,我們也可以用類似的方法來解決。

由此,我們想到了將數組與鏈表結合起來的方法,用數組存儲鏈表頭指針,鏈表中存儲與某一頂點的全部鄰接點在數組中的索引,這樣就解決了空間浪費的問題。下面貼出示例代碼:

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef char VertexType;
typedef int EdgeType;
typedef int Status;
typedef struct EdgeNode{/*定義邊表結點*/
    EdgeType Weight;/*定義權值,對於非網圖可以不用*/
    int adjvex;/*定義鄰接點域*/
    struct EdgeNode * next; 
}EdgeNode;
typedef struct VertexNode{/*定義頂點表結點*/
    EdgeNode * head;/*鄰接表頭指針*/
    VertexType data;/*頂點信息域*/
}VertexNode,Adjlist[MAXSIZE];
//typedef struct VertexNode[MAXSIZE] Adjlist;/*定義Adjlist類型爲VertexNode數組*/
typedef struct GraphAdjlist{/*定義圖的鄰接表存儲結構*/ 
    Adjlist adjlist;/*定義鄰接表*/ 
    int VexNum,EdgeNum;
}GraghAdjlist;


Status CreateALGraph(GraphAdjlist *G){
    int i=0,j=0,k=0;/*ijk均爲循環變量*/
    EdgeNode *edge=NULL;
    printf("請輸入頂點數和邊數\n");
    scanf("%d%d",&G->VexNum,&G->EdgeNum);
    char ch=getchar();
    printf("請輸入各個頂點的信息\n");
    for(i=0;i<G->VexNum;i++){
        scanf("%c",&G->adjlist[i].data);
        ch=getchar();
    }
    for(k=0;k<G->EdgeNum;k++){
        printf("請輸入<vi,vj>邊上的頂點序號\n");
        scanf("%d%d",&i,&j);
        ch=getchar();
        edge=(EdgeNode *)malloc(sizeof(EdgeNode));
        if(!edge){
            printf("malloc failed\n");
            return ERROR;
        }
        edge->adjvex=j;
        edge->next=G->adjlist[i].head;
        G->adjlist[i].head=edge;

        edge=(EdgeNode *)malloc(sizeof(EdgeNode));
        if(!edge){
            printf("malloc failed\n");
            return ERROR; 
        }
        edge->adjvex=i;
        edge->next=G->adjlist[j].head;
        G->adjlist[j].head=edge;
    }
}

/*銷燬圖*/
Status DestroyGraph(GraphAdjlist *G){
    int i=0;
    EdgeNode * pMove=NULL, *qMove=NULL;
    while(pMove&&i<G->VexNum){
        pMove=G->adjlist[i].head;
        while(pMove){
            qMove=pMove->next;
            free(pMove);
            pMove=qMove;
        }
        i++;
    }
    return OK;
} 
int main(void){
    GraghAdjlist G;
    CreateALGraph(&G); 
    if(DestroyGraph(&G))
        printf("銷燬成功\n");
    else
        printf("銷燬失敗\n");   
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章