一.图的相关概念
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
于 教学实验综合楼