#include <stdio.h>
#include <malloc.h>
#define MaxInt 32767
#define MVNum 100
typedef char VerTexType; //假设顶点的数据类型为字符型
typedef int ArcType; //假设边的权值类型为整型
typedef struct
{
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVNum]; //邻接矩阵
int vexnum, arcnum; //图当前点数和边树
} AMGraph;
int LocateVex(AMGraph *G, VerTexType v)
{
int i, j;
for (i = 0; i < G->vexnum; i++)
{
if (G->vexs[i] == v)
{
return i;
}
}
return 1;
}
AMGraph *CreateUDN(AMGraph *G)
{ //采用邻接矩阵表示法,创建无向网G
int i, j, k;
int vexnum, arcnum; //总顶点数,总边数
G = malloc(sizeof(AMGraph));
printf("Please enter the total number of vertices:\n"); //输入总顶点数
scanf("%d", &(G->vexnum));
printf("Please enter an edge:\n"); //输入总边数
scanf("%d", &(G->arcnum));
for (i = 0; i < G->vexnum; i++) //依次输入点的信息
{
printf("Please enter NO.%d vertices value:\n", i + 1);
scanf("%s", &(G->vexs[i]));
}
for (i = 0; i < G->vexnum; i++)
{ //初始化邻接矩阵,边的权值均置为极大值MaxInt
for (int j = 0; j < G->vexnum; j++)
{
G->arcs[i][j] = MaxInt;
}
}
for (k = 0; k < G->arcnum; k++)
{
VerTexType v1, v2; //顶点
int w; //权值
//输入顶点
printf("Please enter first vertex:\n");
scanf("%s", &v1);
printf("Please enter second vertex:\n");
scanf("%s", &v2);
//输入两个顶点之间的权值
printf("Please enter the weight:\n");
scanf("%d", &w);
//确定v1和v2在G中的位置,即顶点数组的下标
i = LocateVex(G, v1);
j = LocateVex(G, v2);
G->arcs[i][j] = w; //边<v1,v2>的权值置为w
G->arcs[j][i] = G->arcs[i][j]; //置<v1,v2>的对称边<v2,v1>的权值为w
}
return G;
}
int main()
{
AMGraph *G;
G = CreateUDN(G);
int i, j;
for (i = 0; i < G->vexnum; i++)
{
for (j = 0; j < G->vexnum; j++)
{
printf("%d\t", G->arcs[i][j]);
}
printf("\n");
}
return 0;
}