图的邻接矩阵存储及其具体实现

一.图的相关概念

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
于 教学实验综合楼

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