一.图的结构体介绍
在开始之前我们先思考如何对图进行描述。图是由点和边构成的,要想用编程语言对图进行描述,就必须把点和边描述清楚。在采用邻接矩阵创建图时,我们需要用一个一维数组记录顶点的情况和一个二维数组记录边的情况。代码如下:
typedef char VerTexType;
typedef int ArcType;
typedef struct{
int numv,nume;//记录点和边的数目
VerTexType vers[maxnumv];//记录点
ArcType arcs[maxnumv][maxnumv];//记录边
}AMGraph;
这样我们就创建了一个图的结构体。
二.邻接矩阵介绍
邻接矩阵其实就是一个二维数组。我们知道边其实是两个顶点之间的关系,我们采用二维数组来记录边。因为二维数组有两个下标,i和j,可以代表两个点。我们先建立一个图:
这是一个有五个顶点五条边的图,我们先将顶点存入vers[5]中。如图:
接下来我们就要有邻接矩阵来存储边的关系了。邻接矩阵是这样的,若两个顶点之间有边,则两个顶点对应的下标构成的二维数组的值为1,否则为0。比如先前建立的图的邻接矩阵为:
不难发现,无向图的邻接矩阵是对称的。这样我们就对图中的边进行了描述。
三.完整代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ok 1
#define error -1
#define maxnumv 100
typedef char VerTexType;
typedef int ArcType;
typedef int Status;
typedef struct{
int numv,nume;
VerTexType vers[maxnumv];
ArcType arcs[maxnumv][maxnumv];
}AMGraph;
//获取顶点的下标
int Locate(AMGraph g,VerTexType c){
int i;
for(i=0;i<g.numv;i++){
if(g.vers[i]==c){
return i;
}
}
return error;
}
Status CreatAMGraph(AMGraph *G){
printf("请输入图的总顶点数和总边数:\n");
scanf("%d %d",&(*G).numv,&(*G).nume);
//对图的邻接矩阵进行初始化操作
int i,j;
for(i=0;i<(*G).numv;i++){
for(j=0;j<(*G).numv;j++){
(*G).arcs[i][j]=0;
}
}
//完成各个点的输入
for(i=0;i<(*G).numv;i++){
printf("请输入第%d个点的名称:\n",i+1);
getchar();
scanf("%c",&(*G).vers[i]);
}
//完成各条边的输入
for(i=1;i<=(*G).nume;i++){
printf("请输入第%d条边的两个顶点的名称:\n",i);
getchar();
VerTexType c1,c2;
int x,y;
scanf("%c %c",&c1,&c2);
x=Locate((*G),c1);
y=Locate((*G),c2);
(*G).arcs[x][y]=1;
(*G).arcs[y][x]=1;
}
}
//输出图的邻接矩阵
void ShowAMGraph(AMGraph g){
int i,j;
printf(" ");
for(i=0;i<g.numv;i++){
printf(" %c",g.vers[i]);
}
printf("\n");
for(i=0;i<g.numv;i++){
printf("%c ",g.vers[i]);
for(j=0;j<g.numv;j++){
printf("%d ",g.arcs[i][j]);
}
printf("\n");
}
}
int main()
{
AMGraph G;
CreatAMGraph(&G);
ShowAMGraph(G);
return 0;
}
运行结果如图: