圖由頂點與邊/弧組成,元素間關係複雜,無法像線性表或樹那樣用記憶體物理位置表示邏輯關係,因此需要專門的儲存結構。
採用兩個陣列:一維陣列存頂點,二維陣列存邊關係。
設圖 G(V,E) 有 n 個頂點,鄰接矩陣為 n×n 方陣:
arc[i][j] = 1 表示有邊,矩陣對稱arc[i][j] = 1 表示弧 <Vi, Vj>,矩陣不對稱arc[i][j] 存權值,無連線用 ∞ (如 65535)#define MAXVEX 100
#define INFINITY 65535
typedef struct {
char vexs[MAXVEX]; // 頂點表
int arc[MAXVEX][MAXVEX]; // 鄰接矩陣
int numVertexes; // 頂點數
int numEdges; // 邊數
} MGraph;
針對稀疏圖優化空間:頂點用陣列,每個頂點的鄰接點用單向鏈表。
weight 域有向圖專用,結合鄰接表與逆鄰接表,節點同時有「出弧」與「入弧」指標,可同時高效求入度與出度。
無向圖專用,邊表節點被兩個頂點共享,避免無向圖鄰接表中邊資料重複儲存。
兩個結構:頂點表 + 邊集陣列(每個元素存始點、終點、權值)。適合以邊為中心的演算法(如 Kruskal)。
| 結構 | 適用場景 | 空間複雜度 | 查邊 | 求度 |
|---|---|---|---|---|
| 鄰接矩陣 | 稠密圖、頻繁查邊 | O(n²) | O(1) | O(n) |
| 鄰接表 | 稀疏圖、頻繁遍歷鄰接點 | O(n+e) | O(度) | O(度) |
| 十字鏈表 | 有向圖、需同時求入/出度 | O(n+e) | O(度) | O(1) |
| 鄰接多重表 | 無向圖、邊操作頻繁 | O(n+e) | O(度) | O(度) |
| 邊集陣列 | Kruskal 等邊中心演算法 | O(e) | O(e) | O(e) |