圖的鏈式儲存(鄰接表)【摘錄自嚴長生老師的網站】
阿新 • • 發佈:2018-11-28
當圖比較稀疏時,採用鄰接矩陣儲存會比較浪費空間,因為大部分空間都會填充為0,這時候採用鄰接表儲存是一個可行方案。
如上圖所示,每個頂點都是一個表頭結點,data存放資料,fisrtarc是指向表中結點的指標,表中結點的adjvex存放該頂點的下標,nextarc是指向下一個表中結點的指標,info在圖中可省略,在網中用來儲存邊的權重,info與nextarc交換一下更好一些。
以一個有向圖為例,下圖左為有向圖,右側為鄰接表。
在C語言中的儲存方式如下
#define MAX_VERTEX_NUM 20//最大頂點個數 #define VertexType int//頂點資料的型別 #define InfoType int//圖中弧或者邊包含的資訊的型別 typedef struct ArcNode{ int adjvex;//鄰接點在陣列中的位置下標 struct ArcNode * nextarc;//指向下一個鄰接點的指標 InfoType * info;//資訊域 }ArcNode; typedef struct VNode{ VertexType data;//頂點的資料域 ArcNode * firstarc;//指向鄰接點的指標 }VNode,AdjList[MAX_VERTEX_NUM];//儲存各連結串列頭結點的陣列 typedef struct { AdjList vertices;//圖中頂點及各鄰接點陣列 int vexnum,arcnum;//記錄圖中頂點數和邊或弧數 int kind;//記錄圖的種類 }ALGraph;