圖的存儲結構
圖中頂點沒有次序之分。
圖中邊的頂點的數量是任意的。
-
鄰接矩陣
- 頂點
用一維數組來存儲。 - 邊或者弧
用二維數組來存儲。
1:若是中的邊
0:若不是中的邊
通過看是0還是1來判斷兩個頂點之間是否有邊。
通過掃描對應的行,把所有的元素加起來就是某個頂點的度。
通過掃描對應的行,值爲1的頂點爲其鄰接點。
無向圖的鄰接矩陣是一個對稱矩陣,所以可以只存儲鄰接矩陣的上半部分。
對於有向圖來說,頂點的入度是頂點所在這一列的各數之和;出度是頂點所在這行的各數之和。
對於帶權圖可以在矩陣中存儲邊的權值。帶權邊存儲權值,行和列相同結點權值爲0,不存在的邊權值爲無限大。#define MaxVertexNum 100 // 頂點數目的最大值 typedef char VertexType; // 頂點的數據類型 不同情況不一樣 typedef int EdgeType; // 整數表示權值或者連通性 typedef struct{ VertexType Vex[MaxVertexNum]; // 頂點表 EdgeType Edge[MaxVertexNum][MaxVertexNum] // 鄰接矩陣(二維數組),邊表 int vexnum,arcnum; // 圖的當前頂點數和弧數 }MGraph;
- 頂點
-
鄰接表(鏈式存儲)
圖中的頂點用一個一維數組存儲。同時每個元素還要存儲指向第一個鄰接點的指針(鏈表的頭指針)。存儲頂點和頭指針的表叫做頂點表。
圖中每個頂點的所有鄰接點構成一個單鏈表。對於無向圖,這個表稱爲該結點的邊表。對於有向圖來說稱爲該結點的出邊表。//需要設計兩種結點結構類型:一是頂點表的頂點,一是單鏈表的結點 typedef struct VNode{ // 頂點表結點 VertexType data; // 頂點信息 ArcNode *firstedge; // 單鏈表頭指針 }VNode,AdjList[MaxVertexNum]; #define MaxVertexNum 100 //圖中頂點數目的最大值 typedef struct ArcNode{ // 邊表結點 int adjvex; // 該弧所指向的頂點的位置 struct ArcNode *next; // 指向下一條弧的指針 }ArcNode; typedef struct{ AdjList vertices; // 鄰接表 int vexnum,arcnum; //圖的頂點數和弧數 }ALGraph; //ALGraph是以鄰接表存儲的圖類型
-
十字鏈表(有向圖)
十字鏈表是針對有向圖的存儲方式,對應於有向圖中的每條弧有一個結點,對應於每個頂點也有一個結點。
鄰接表存儲的無向圖中查找頂點是比較容易的,但是如果要修改圖中的邊或者是查詢邊,則需要遍歷鏈表。這就是鄰接表的缺陷。
頂點結點 有三部分- data 圖中頂點的數據
- firstin 該頂點的入邊表的頭指針
- firstout 該頂點的出邊表的頭指針
邊表結點有四部分
- tailvex 這條弧的弧尾(起點)所在頂點表的下標
- headvex 這條弧的弧頭(終點)所在頂點表的下標
- headlink 指向弧頭(終點)相同的下一條邊
- taillink 指向弧尾(起點)相同的下一條邊
//頂點結點 typedef struct VNode{ VertexType data; ArcNode *firstin, *firstout; }VNode; //邊表結點 typedef struct ArcNode{ int tailvex,headvex; struct ArcNode *hlink,*tlink; }; typedef struct{ VNode xlist[MaxVertexNum]; // 頂點依舊用順序存儲(數組) int vexnum,arcnum; // 圖的頂點數和弧數 }GLGraph; // 十字鏈表存儲的圖類型
-
鄰接多重表(無向圖)
頂點表與十字鏈表相同,只有後面的邊表不同。
有四個結點
其中ivex和jvex爲這條邊依附的兩個頂點在頂點表中的下標
ilink 指向依附頂點ivex的下一條邊
jlink 指向依附頂點jvex的下一條邊- ivex
- ilink
- jvex
- jlink
-