圖的鄰接矩陣存儲及其具體實現

一.圖的相關概念

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
於 教學實驗綜合樓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章