建立圖-鄰接表


  鄰接表是圖的一種順序存儲和鏈式存儲相結合的存儲方法,對於鄰接矩陣存儲方法中,邊數相對頂點較少的圖造成的空間浪費,在鄰接表中很好的避免了這個問題。

  對於圖中每個頂點Vi,將鄰接於Vi的所有頂點Vj鏈成一個單鏈表,單鏈表中的節點稱為表節點,這個單鏈表就稱為頂點Vi的鄰接表,對每個頂點的鄰接表建立一個頭節點,這些頭節點通常以順序結構存儲,即為了便於隨機訪問任意頂點的鄰接表,可以將所有點的鄰接表的頭節點放到一個數組里,這個頭節點數組稱為頂點表,因此,在圖的鄰接表表示中有兩種節點結構。

  關於鄰接表的幾點說明

1:一個圖的鄰接矩陣的表示是唯一的,但其鄰接表不唯一

2:為了便於確定有向圖頂點的入度,可以為有向圖建立逆鄰接表,而i號單鏈表中的節點個數只是頂點Vi的出度

圖的鄰接表存儲如下:

 1 //建立無向圖鄰接表
 2 #include<stdio.h>
 3 #include<malloc.h>
 4 #define MAX_VEX 100                        //最大頂點數為100
 5 
 6 typedef struct node{                       //定義表節點 
 7     int adjvex;                            //鄰接頂點域 
 8     struct node *next;                     //指向下一個鄰接頂點的指針域 
 9     //char info;                           //若為帶權無向圖,表示權值,加上數據域info 
10 }Arcnode; 
11 typedef struct vexnode{                    //定義頭節點 
12     int vertex;                            //頂點域 
13     Arcnode *firstacr;                     //邊表頭指針 
14 }Vexnode;                                  //vexnode事以鄰接表方式存儲的圖類型
15 
16 Vexnode adjlist[MAX_VEX];                  //定義頭節點數組
17 
18 int creatadjlist()                         //建立鄰接表 
19 {
20     Arcnode *ptr;
21     int arcnum,vexnum,k,v1,v2;
22     printf("請輸入頂點數和邊數:\n");
23     scanf("%d %d",&vexnum,&arcnum);
24     for(k = 1;k <= vexnum;k++)
25         adjlist[k].firstacr = 0;            //為鄰接鏈表數組的元素鏈域賦初值
26     for(k = 0;k < arcnum;k++)               //為adjlist數組的個元素分別建立各自的鏈表 
27     {
28         printf("v1,v2=");
29         scanf("%d %d",&v1,&v2);
30         ptr = (Arcnode *)malloc(sizeof(Arcnode));
31         ptr->adjvex = v2;                    //將頂點v2插入到鏈表中,使得節點插入后單鏈表仍然有序,鏈表采用頭插法 
32         ptr->next = adjlist[v1].firstacr;
33         adjlist[v1].firstacr = ptr;          //將鄰接點v2插入表頭節點v1之后
34         //以下四行代碼只對無向圖起作用
35         ptr = (Arcnode *)malloc(sizeof (Arcnode));
36         ptr->adjvex = v1;
37         ptr->next = adjlist[v2].firstacr;
38         adjlist[v2].firstacr = ptr;
39     } 
40     
41     return vexnum;
42 }
43 
44 int main()
45 {
46     int i, n;
47     Arcnode *p;
48     n = creatadjlist();
49     printf("所建圖的鄰接表為:\n");
50     for(i = 1;i <= n;i++)
51     {
52         printf("%d==>",i);
53         p = adjlist[i].firstacr;
54         while(p != NULL)
55         {
56             printf("-- -->%d",p->adjvex);
57             p = p->next;
58         }
59         printf("\n\n");
60     }
61     
62     return 0;
63 } 
View Code

 


免責聲明!

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



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