图的存储结构之邻接矩阵

        由于图的结构比较复杂,任意两个顶点之间都可能存在关系,因此不能以数据元素在存储中的物理位置表示元素之间的关系,即图没有顺序存储结构,但是可以借助数组的数据类型表示元素之间的关系,不谈了直接上代码:

// 图之存储结构-------邻接矩阵

#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)条边。

猜你喜欢

转载自blog.csdn.net/qq_23913079/article/details/81159332