一.圖的相關概念
1.圖的定義
2.圖的相關概念
要查看更詳盡的概念,請參閱《大話數據結構》
二.圖的鄰接矩陣存儲結構
由於圖在結構上的複雜性,我們無法簡單地用一個順序存儲結構來進行圖的存儲。由於無法用一個一維數組進行存儲,那麼考慮二維數組來進行存儲。
*鄰接矩陣用一個一維數組來存儲各個頂點的信息,用一個二維數組來存儲各個頂點之間的連接關係*
我們來看一個實例:
我們很容易理解頂點數組的意義,那麼如何理解邊數組呢?下面做出解釋:以頂點V0爲例,保持V0所在行標不變,改變列標,由於V0與V0自己無法連接,故爲0;而V0到V1由於有連接,故V0行V1列值爲1,其他以此類推。
鄰接矩陣的具體實現
通過前面的討論,我們可以得到鄰接矩陣的存儲結構。定義一個結構體,其中含有一個一維數組存儲頂點,稱爲頂點表;結構成員還包含一個二維數組,存儲頂點之間的連接信息,稱爲邊數組;還需要兩個int型變量,一個存儲頂點數,另一個存儲邊數。
下面貼出代碼供各位參考:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
#define INFINITY 65535/*65535被爲int類型最大值,定義爲"無窮大"*/
typedef char VertexType;/*頂點類型char*/
typedef int Arc;/*邊的類型爲int*/
typedef int Status;
typedef struct MGragh{
VertexType Vexs[MAXSIZE];/*定義頂點表*/
Arc Edge[MAXSIZE][MAXSIZE];/*定義邊數組*/
int EdgeNum;
int VexsNum;
}MGragh;
/*創建無向網圖*/
Status CreateMGragh(MGragh *G){
int i=0,j=0,k=0,wet=0;/*i,j,j做循環變量,wet爲邊的權值*/
char ch;
/*用戶輸入,獲取頂點數,邊數*/
printf("請輸入頂點數和邊數\n");
scanf("%d%d",&G->VexsNum,&G->EdgeNum);
ch=getchar();/*上面的頂點數和邊數輸入完成後,會按一次enter鍵,這裏的ch用於"吸收"enter防止對下一步輸入造成影響*/
/*對邊數組進行初始化*/
for(i=0;i<G->VexsNum;i++){
for(j=0;j<G->VexsNum;j++)
G->Edge[i][j]=INFINITY;
}
/*用戶輸入,生成頂點數組*/
printf("請輸入頂點信息(char類型)\n");
for(i=0;i<G->VexsNum;i++) {
scanf("%c",&G->Vexs[i]);
ch=getchar();
}
/*用戶輸入,爲各條邊賦權值*/
for(k=0;k<G->VexsNum;k++){
printf("請輸入(vi,vj)邊的下標i,j和權值w");
scanf("%d%d%d",&i,&j,&wet);
ch=getchar();
G->Edge[i][j]=wet;
G->Edge[j][i]=G->Edge[i][j];/*由於是無向圖,爲對稱矩陣,可用此法創建邊數組*/
}
}
/*在屏幕上顯示鄰接矩陣*/
Status DispMGragh(MGragh *G){
int i=0,j=0;
printf("G含有%d個頂點,%d條邊\n",G->VexsNum,G->EdgeNum);
printf("打印頂點表信息\n");
for(i=0;i<G->VexsNum;i++)
printf("%c ",G->Vexs[i]);
printf("各節點相連情況\n");
for(i=0;i<G->VexsNum;i++){
printf("[%d]\t",i);
for(j=0;j<G->VexsNum;j++){
if(G->Edge[i][j]==INFINITY)
printf("∞\t");
else
printf("%d\t",G->Edge[i][j]);
}
printf("\n");
}
}
int main(void){
MGragh G;
CreateMGragh(&G);
DispMGragh(&G);
}
運行結果如圖
2016-05-27
於 教學實驗綜合樓