?鄰接矩陣:
1.概念:
鄰接矩陣是圖的存儲結構之一,通過二維數組表示頂點間的連接關系。
2.具體例子?:
一.無向圖鄰接矩陣示例:
示例圖(頂點:A、B、C,邊:A-B、B-C):
鄰接矩陣:A B C
A 0 1 0
B 1 0 1
C 0 1 0
特點:
- 矩陣對稱,主對角線為0(無自環邊)。
- 頂點B的度為2,對應第2行/列非零元素數量。
- 非零元素總數=邊數×2(無向圖雙向性)。
二、有向圖鄰接矩陣示例
示例圖(頂點:V1→V2、V2→V3、V3→V1):
鄰接矩陣:V1 V2 V3
V1 0 1 0
V2 0 0 1
V3 1 0 0
特點:
- 矩陣不對稱(邊方向性)。
- V3的入度=1(第3列非零數),出度=1(第3行非零數)。
三、帶權圖(網)鄰接矩陣示例
示例圖(頂點:A、B、C,邊:A-B權2,B-C權5):
鄰接矩陣(∞表示無窮):A B C
A 0 2 ∞
B 2 0 5
C ∞ 5 0
特點:
- 權值替代0/1,主對角線仍為0。
- 對稱性保留(無向網),稀疏圖可能用壓縮存儲。
鄰接表:
概念:
鄰接表是圖數據結構最常用的鏈式存儲方式,通過數組與鏈表結合實現頂點與邊的離散化存儲。
- 組成結構
- 頂點表(頭節點表):一維數組存儲頂點信息,每個元素包含頂點值和指向首個鄰接點的指針。
- 邊表(鏈表節點):每個頂點對應的鏈表,存儲其所有鄰接點的索引(或地址)及邊權重(網圖)。例如頂點A的鏈表包含C,表示存在邊AC。
示例圖結構:
假設存在無向圖如下(頂點:A、B、C、D;邊:A-B、A-C、B-C、B-D、C-D):
A
/ \
B——C \ /D
鄰接表存儲實現
1. 頂點表(順序存儲)
頂點表使用數組存儲,每個元素包含頂點信息和指向鄰接鏈表的指針:
頂點表索引 | 頂點數據 | 邊表頭指針
---------------------------------
0 | A | → 1 → 2 → NULL
1 | B | → 0 → 2 → 3 → NULL
2 | C | → 0 → 1 → 3 → NULL
3 | D | → 1 → 2 → NULL
2. 邊表(鏈表存儲)
每個頂點的邊表以鏈表形式存儲鄰接頂點(本例使用頭插法):
- 頂點A的鄰接鏈表:B(索引1)、C(索引2)
- 頂點B的鄰接鏈表:A(索引0)、C(索引2)、D(索引3)
- 頂點C的鄰接鏈表:A(索引0)、B(索引1)、D(索引3)
- 頂點D的鄰接鏈表:B(索引1)、C(索引2)
// C語言實現(無向圖)
typedef struct ArcNode { // 邊表節點 int adjvex; // 鄰接頂點索引 struct ArcNode *next; // 指向下一鄰接點
} ArcNode;typedef struct VNode { // 頂點表節點 char data; // 頂點數據 ArcNode *firstarc; // 指向第一個鄰接點
} VNode, AdjList[MAX_VERTEX];typedef struct {AdjList vertices; // 頂點表數組 int vexnum, arcnum; // 頂點數和邊數
} ALGraph;