1.鄰接矩陣存儲:
鄰接矩陣是表示頂點之間相鄰關係的矩陣。設G=(V,E)是具有n(n>0)個頂點的圖,頂點的編號依次爲0~n-1。
G的鄰接矩陣A是n階方陣,其定義如下:
1)如果G是無向圖,則:
A[i][j]=1:若(i,j)∈E(G) 0:其他
(2)如果G是有向圖,則:
A[i][j]=1:若<i,j>∈E(G) 0:其他
(3)如果G是帶權無向圖,則:
A[i][j]= wij :若i≠j且(i,j)∈E(G) 0:i=j ∞:其他
(4)如果G是帶權有向圖,則:
A[i][j]= wij :若i≠j且<i,j>∈E(G) 0:i=j ∞:其他
圖的鄰接矩陣存儲類型定義如下:
#define MAXV <最大頂點個數>
typedef struct //---------------------------聲明頂點的類型
{ int no; //頂點編號
InfoType info; //頂點其他信息
} VertexType;
typedef struct //圖的定義---------------------------聲明的鄰接矩陣類型
{ int edges[MAXV][MAXV]; //鄰接矩陣
int n,e; //頂點數,邊數
VertexType vexs[MAXV]; //存放頂點信息
} MatGraph;
鄰接表:
對圖中每個頂點i建立一個單鏈表,將頂點i的所有鄰接點鏈起來。
每個單鏈表上添加一個表頭結點(表示頂點信息)。並將所有表頭結點構成一個數組,下標爲i的元素表示頂點i的表頭結點。
例如:
鄰接表的特點如下:
1、鄰接表表示不唯一。
2、特別適合於稀疏圖存儲。 -------------- 鄰接表的存儲空間爲O(n+e)。
圖的鄰接表存儲類型定義如下:
typedef struct ANode//------------------------聲明邊結點類型
{ int adjvex; //該邊的終點編號
struct ANode *nextarc; //指向下一條邊的指針
InfoType weight; //該邊的權值等信息
} ArcNode;
typedef struct Vnode//-----------------------------聲明鄰接表頭結點類型
{ VertexType data; //頂點信息
ArcNode *firstarc; //指向第一條邊
} VNode;
typedef struct //----------------------------聲明圖鄰接表類型
{ VNode adjlist[MAXV]; //鄰接表(有多少個頂點就有多少個元素)
int n,e; //圖中頂點數n和邊數e
} AdjGraph;
一個鄰接表通常用指針引用:
逆鄰接表: 就是在有向圖的鄰接表中,對每個頂點,鏈接的是指向該頂點的邊。
此次博客暫未寫完,暫代更新之中…