圖的鄰接表表示


  要完整地表示一個圖,就需要明確圖中有什么,很簡單,節點和邊。

  所以,在用鄰接表表示一個圖的時候,我們需要分別表示其節點和邊,然后用邊將節點連接起來即可。

  使用鄰接表,文字上的描述就是,將所有節點放入一張鄰接表中,對於每個節點的鄰接節點,用一個鏈表將其連接起來。

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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM