要完整地表示一個圖,就需要明確圖中有什么,很簡單,節點和邊。
所以,在用鄰接表表示一個圖的時候,我們需要分別表示其節點和邊,然后用邊將節點連接起來即可。
使用鄰接表,文字上的描述就是,將所有節點放入一張鄰接表中,對於每個節點的鄰接節點,用一個鏈表將其連接起來。
1 鄰接表中邊、節點、圖定義
1 typedef struct Edge 2 { 3 int adjvex; 4 struct Edge *nextEdge; 5 }Edge; 6 //頂點表 7 typedef struct VNode 8 { 9 int data; 10 Edge *firstEdge; 11 }VNode; 12 //鄰接表 13 typedef struct AGraph 14 { 15 VNode adjlist[MAXSIZE]; 16 int n,e; 17 }AGraph;
定義是按照從上往下寫的,但是思考的時候,應該從下往上思考。
我們現在需要一個圖,圖中是若干節點,有e條邊。
圖中的這n和節點,我們需要知道哪些邊是和它相接的,所以,對應每個節點(VNode),我們需要一個頭指針(firstEdge),指向其第一條邊,通過這個指針,鄰接表中每個節點就具有了向外延伸的能力。延伸的過程就是建立單向鏈表。類似於“頭插法”。
鄰接表表示,最直觀的就是表示了圖中的n個節點,以及和每個節點相鄰的邊,節點存儲在順序表中,邊存儲在單向鏈表中。
2 創建
1 void creategra(AGraph *g,int n,int e) 2 { 3 Edge *s; 4 g->n = n; 5 g->e = e; 6 for(int i=0;i<n;i++) 7 { 8 g->adjlist[i].data=i; 9 g->adjlist[i].firstEdge=NULL; 10 } 11 printf("input the edge\n"); 12 int a,b; 13 for(int i=0;i<e;i++) 14 { 15 scanf("%d%d",&a,&b); //a到b有路徑 16 s = (Edge *)malloc(sizeof(Edge)); 17 s->adjvex=b; 18 s->nextEdge=g->adjlist[a].firstEdge; 19 g->adjlist[a].firstEdge=s; 20 } 21 }
對於一個圖,有n個節點,我們假設節點是從0到n-1。將這n個節點放到鄰接表中(8行),開始時沒有任何邊和他們鏈接(9行)。
我們有了節點之后,就需要用邊將他們連接起來,例如,a到b有路徑,我們就申請一塊空間存儲a->b這條邊的信息(16行)。這條邊鄰接節點是b。將這條邊插入到鄰接表中(18、19行)。那么,a這個節點的第一條邊就是a->b。當我們再連接a和c時,a這個節點的第一條邊就是a->c,他的下一條邊就是a->b。
