下面是一个例子:
共有abcd四个顶点,并且有<a,b>,<b,c>,<c,d>,<d,a>四个边,并且是无向边。
为此我们可以建立一个矩阵来存储,存储方式如下:
其中,0代表当前位置没有边,1代表有边,也可以是权值大小。
上图的存储方式和二维数组的存储方式极为相似。
为此我们可以使用二维数组来模拟这个存储。
其中行索引代表以当前索引为弧尾的边。
列索引代表以当前索引为弧头的边。
#include<stdio.h>
#define MAX 100
typedef struct Mgraph{
char vertex[MAX];
int arcs[MAX][MAX];
int vexnum,acrnum;
}Mgraph;
int LocateVerTex(Mgraph *G,char v) //搜索顶点在邻接矩阵中的下标索引位置
{
int k;
for(k=0;k<G->vexnum;k++){
if(v == G->vertex[k])
return k;
}
return -1; //-1代表未搜寻到下标索引
}
void CreateMgraph(Mgraph *G)
{
int i,j,k,weight;
char ch1,ch2;
printf("请输入顶点数和边数:\n");
scanf("%d %d",&(G->vexnum),&(G->acrnum)); //输入顶点数和边数
getchar();
printf("下面请输入{%d}个顶点:\n",G->vexnum);
for(i=0;i<G->vexnum;i++){ //输入每个顶点
scanf("%c",&(G->vertex[i]));
}
getchar();
for(i=0;i<G->vexnum;i++){ //初始化邻接矩阵。
for(j=0;j<G->vexnum;j++){
G->arcs[i][j] = 0;
}
}
printf("下面请顺序输入顶点v1,顶点v2,以及边权大小\n");
for(k=0;k<G->acrnum;k++){
scanf("%c %c %d",&ch1,&ch2,&weight);
getchar();
i = LocateVerTex(G,ch1);
j = LocateVerTex(G,ch2);
if(i==-1||j==-1){
printf("失败.\n");
k = k - 1; //索引减1,为的是下次还是当前索引。
continue; //代表该顶点出错重新执行。
}
else{
G->arcs[i][j] = weight;
G->arcs[j][i] = weight;
}
printf("成功.\n");
}
}
int main()
{
Mgraph G;
CreateMgraph(&G);
return 0;
}