1. 程式人生 > >圖的鏈式儲存(鄰接表)【摘錄自嚴長生老師的網站】

圖的鏈式儲存(鄰接表)【摘錄自嚴長生老師的網站】

當圖比較稀疏時,採用鄰接矩陣儲存會比較浪費空間,因為大部分空間都會填充為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;