初學鄰接表會覺得鄰接表很難記憶,尤其是其數據結構部分,下面我們簡單介紹一下鄰接表。
1. 大體的認識
首先給出一個有向圖和它的鄰接表。
給出其數據結構的表示
// 邊表的結構
typedef struct ArcNode
{
// 存儲該頂點對應的下標
int adjvex;
// 指向的下一跳指針
struct ArcNode *nextarc;
}ArcNode;
// 頂點表
typedef struct
{
// 頂點信息
int data;
// 指向的第一條邊的指針
ArcNode *firstArc;
}VNode;
// 頂點表和邊表組成鄰接表
typedef struct
{
// 鄰接表
VNode adjlist[maxSize];
// 頂點數和邊數
int n,e;
}AGraph;
2. 細分來看看
可以看到數據結構相對來說比較龐雜,不好記憶,初學也不好理解。下面來詳細分析以下其結構
上圖是一個鄰接表的圖示。
其中紅色橢圓部分就是數據結構中的頂點表,它表示的是有向圖或者無向圖中的頂點 vi
其中紅色矩形部分就是邊表,其表示兩個頂點之間存在的邊的關係,就是這兩個點通過一條邊連在了一起。如 v0 指向 3 (3 表示在頂點表中下標爲 3 的元素,頂點表是一個數組,後面講)而 3 在頂點表中代表 v3(關注左側的數組下標,這裏數組是豎着放的)
最後,這兩個表組成的最外面的藍色邊框就稱爲鄰接表。
這個時候你可以在回顧以下給出的數據結構的代碼,重新理解以下。
3. 再細一點
下面我們來看看每個小的數據結構各自的含義
邊表結構
在邊表的結構中,adjvex 表示的是頂點的下標(我們說過,頂點表是用數組實現的,後面會再講)
而 *nextarc 是指向下一個頂點的指針,就是圖中的那個黑色箭頭
最後這個邊表結果我們通常命名爲 ArcNode,Arc 就是弧,邊的意思(當然名字隨意取)
頂點表結構
data 代表的就是有向圖或者無向圖的頂點。
*firstArc 表示頂點在數據結構中指向的第一條邊
最後,VNode 中 v 是 vertex 頂點的縮寫。
鄰接表結構
最後,adjlist (adj 是 adjacent,表示毗鄰,鄰近的意思)我們看到是一個數組,這就是頂點數組,我們通過鄰接表(AGraph)找到頂點數組,通過頂點數組的 *firstArc 就可以訪問任何的頂點(即遍歷整個圖)了。
以上便是對鄰接表數據結構的簡單入門。