由于图的结构比较复杂,任意两个顶点之间都可能存在关系,因此不能以数据元素在存储中的物理位置表示元素之间的关系,即图没有顺序存储结构,但是可以借助数组的数据类型表示元素之间的关系,不谈了直接上代码:
// 图之存储结构-------邻接矩阵
#include "stdafx.h"
#include "stdio.h"
#define VERTEX_NUM 100 //最大顶点数
#define INFINITY 65535 //无穷权值
typedef char Vertex_type; //顶点类型
typedef int Edge_type; //权值类型
#define DEBUG
typedef struct Graph_node
{
Vertex_type vex[VERTEX_NUM];
Edge_type arc[VERTEX_NUM][VERTEX_NUM];
int vex_num, arc_num;
}DGraph;
int local_vex(DGraph *G,char ch) //返回顶点位置
{
int i;
for ( i = 0; i < G->vex_num; i++)
{
if (ch==G->vex[i])
{
break;
}
}
if (i>=G->vex_num)
{
return -1;
}
return i;
}
void Create_Graph(DGraph *G)
{
int i, j, w,flag=1;
printf("请输入顶点数和边数(中间用空格隔开):");
while (flag)
{
scanf_s("%d %d",&G->vex_num,&G->arc_num);
if (G->arc_num>G->vex_num*(G->vex_num-1)/2)
{
printf("您输入的边数超出了组网的最大边数量,请重新输入顶点数和边数:");
continue;
}
flag = 0;
}
#ifdef DEBUG
printf("顶点数:%d,边数:%d",G->vex_num,G->arc_num);
#endif // DEBUG
printf("\n请输入顶点:");
for ( i = 0; i < G->vex_num; i++)
{
G->vex[i] = getchar();
while (G->vex[i]=='\n'|| G->vex[i] == ' ')
{
G->vex[i] = getchar();
}
}
///printf("\n");
#ifdef DEBUG
printf("您输入的顶点为:");
for ( i = 0; i < G->vex_num; i++)
{
printf("%c ",G->vex[i]);
}
printf("\n");
#endif // DEBUG
printf("邻接矩阵初始化...\n");
for ( i = 0; i < G->vex_num; i++)
{
for ( j = 0; j < G->vex_num; j++)
{
G->arc[i][j] = INFINITY;
}
}
printf("邻接矩阵初始化完成...\n");
//printf("请输入一条边的两个顶点及权值(并用空格隔开):");
char ch1, ch2;
int loc1=-1, loc2=-1;
for ( i = 0; i < G->arc_num; i++)
{
printf("请输入一条边的两个顶点(并用空格隔开):");
ch1 = getchar();
while (ch1 == '\n' || ch1 == ' ')
{
ch1 = getchar();
}
ch2 = getchar();
while (ch2=='\n'||ch2==' ')
{
ch2 = getchar();
}
loc1 = local_vex(G, ch1);
loc2 = local_vex(G, ch2);
if (loc1 == -1 || loc2 == -1)
{
printf("\n未找到您输入的顶点,请重新输入...\n");
i--;
continue;
}
printf("请输入权值:");
scanf_s("%d", &w);
G->arc[loc1][loc2] = w;
G->arc[loc2][loc1] = w;
}
#ifdef DEBUG
printf("打印测试邻接矩阵:\n");
for ( i = 0; i < G->vex_num; i++)
{
for ( j = 0; j <G->vex_num; j++)
{
printf("%d\t",G->arc[i][j]);
}
printf("\n");
}
#endif // DEBUG
}
int main()
{
Graph_node G;
Create_Graph(&G);
return 0;
}
注意:n个顶点的无向完全图有n*(n-1)条边,即无向图最多有n*(n-1)条边。