圖數據結構的定義

用鄰接矩陣和鄰接表存儲,將其命名爲文件graph.h頭文件,後續圖的所有算法都依賴於該文件。

 1.鄰接矩陣存儲方法  

        鄰接矩陣是表示頂點之間相鄰關係的矩陣。設G=(V,E)是具有nn>0)個頂點的圖,頂點的順序依次爲0~n-1,則G的鄰接矩陣An階方陣,其定義如下:

    (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 :若ij且(i,j)∈E(G)    0:i=j    ∞:其他

    (4)如果G是帶權有向圖,則:

       A[i][j]=  wij :若ij且<i,j>∈E(G)   0:i=j ∞:其他

 

鄰接矩陣的特點如下:

       (1)圖的鄰接矩陣表示是唯一的。

       (2)無向圖的鄰接矩陣一定是一個對稱矩陣。因此,按照壓縮存儲的思想,在具體存放鄰接矩陣時只需存放上(或下)三角形陣的元素即可。

        (3)不帶權的有向圖的鄰接矩陣一般來說是一個稀疏矩陣,因此,當圖的頂點較多時,可以採用三元組表的方法存儲鄰接矩陣。

        (4)對於無向圖,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個數正好是第i個頂點的度。

        (5)對於有向圖,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個數正好是第i個頂點的出度(或入度)。

        (6)用鄰接矩陣方法存儲圖,很容易確定圖中任意兩個頂點之間是否有邊相連。但是,要確定圖中有多少條邊,則必須按行、按列對每個元素進行檢測,所花費的時間代價很大。這是用鄰接矩陣存儲圖的侷限性。

 鄰接矩陣的數據類型定義如下:

#define  MAXV  <最大頂點個數> 

typedef struct

{  int no;  //頂點編號

   InfoType info;  //頂點其他信息

} VertexType;  //頂點類型

typedef struct    //圖的定義

{  int edges[MAXV][MAXV];   //鄰接矩陣

   int n,e;    //頂點數,弧數

   VertexType vexs[MAXV];  //存放頂點信息

} MGraph;  //圖的鄰接矩陣表示類型 

 

2  鄰接表存儲方法

         圖的鄰接表存儲方法是一種順序分配與鏈式分配相結合的存儲方法。在鄰接表中,對圖中每個頂點建立一個單鏈表,第i個單鏈表中的節點表示依附於頂點i的邊(對有向圖是以頂點i爲尾的邊)。每個單鏈表上附設一個表頭節點。

        其中,表節點由三個域組成,adjvex指示與頂點i鄰接的點在圖中的位置,nextarc指示下一條邊或弧的節點,info存儲與邊或弧相關的信息,如權值等。

       表頭節點由兩個域組成,data存儲頂點i的名稱或其他信息,firstarc指向鏈表中第一個節點。

定義存儲結構如下:

typedef struct ANode

{  int adjvex;  //該邊的終點編號

   struct ANode *nextarc;  //指向下一條邊的指針

   InfoType info;  //該邊的相關信息

} ArcNode;  //邊表節點類型

typedef struct Vnode

{  Vertex data;  //頂點信息

   ArcNode *firstarc;  //指向第一條邊

} VNode;  //鄰接表頭節點類型

typedef VNode AdjList[MAXV];  //AdjList是鄰接表類型

typedef struct

{  AdjList adjlist;  //鄰接表

   int n,e;  //圖中頂點數n和邊數e

} ALGraph;  //完整的圖鄰接表類型   

將其命名爲文件graph.h頭文件

完整定義如下:

typedef int InfoType;
#define	MAXV 100				//最大頂點個數
//以下定義鄰接矩陣類型
typedef struct 
{  	int no;						//頂點編號
	InfoType info;				//頂點其他信息
} VertexType;					//頂點類型
typedef struct  				//圖的定義
{  	int edges[MAXV][MAXV]; 		//鄰接矩陣
   	int n,e;   					//頂點數,弧數
	VertexType vexs[MAXV];		//存放頂點信息
} MGraph;						//圖的鄰接矩陣類型
//以下定義鄰接表類型
typedef struct ANode           	//弧的結點結構類型
{	int adjvex;              	//該弧的終點位置
   	struct ANode *nextarc; 		//指向下一條弧的指針
   	InfoType info;           	//該弧的相關信息,這裏用於存放權值
} ArcNode;
typedef int Vertex;
typedef struct Vnode      		//鄰接表頭結點的類型
{	Vertex data;            	//頂點信息
	int count;             		//存放頂點入度,只在拓撲排序中用
    ArcNode *firstarc;     		//指向第一條弧
} VNode;
typedef VNode AdjList[MAXV];	//AdjList是鄰接表類型
typedef struct 
{	AdjList adjlist;         	//鄰接表
    int n,e;                 	//圖中頂點數n和邊數e
} ALGraph;                   	//圖的鄰接表類型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章