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