数据结构之无向网----C语言实现

#include "stdio.h"
#include "stdlib.h"
#define MVN 20
#define Maxint 32767
typedef  char VerTexType;
typedef int ArcType;
typedef struct
{
	VerTexType Vexs[MVN];// 顶点矩阵
	ArcType Arcs[MVN][MVN];// 邻接矩阵
	int Vexnum,Arcnum;// 当前顶点数和边数
}AMGraph;// Adjacency Matrix Graph :邻接矩阵
int get_first(AMGraph* G,VerTexType* v1);
int GetVertex(AMGraph* G);
int LocateVex(AMGraph* G,VerTexType v);
int CreateUDN(AMGraph* G)// 取址G
{	VerTexType v1;
	VerTexType v2;//弧的两个顶点
	int weight; // 弧的权重
	printf("输入顶点的数量:\n");
	scanf("%d",&(*G).Vexnum);// 指定顶点的数量
	printf("输入边的数量:\n");
	scanf("%d",&(*G).Arcnum);// 指定边的数量
	
	for(int i = 0; i< (*G).Vexnum; i++)//对于有向图,初始化为无穷大
	{
		for(int j = 0; j < (*G).Vexnum; j++)
			(*G).Arcs[i][j] = Maxint;
	}
	GetVertex(&(*G));
	for (int k = 0; k < (*G).Arcnum; k++)// 数据写入矩阵
	{	printf("哪两个顶点之间是连通的?\n");
		printf("顶点1:\n");
		get_first(&(*G),&v1);
		printf("顶点2:\n");
		get_first(&(*G),&v2);
		printf("这条弧的权重是多少?:\n");
		scanf("%d",&weight);
		int i = LocateVex(&(*G),v1);
		int j = LocateVex(&(*G),v2);
		(*G).Arcs[i][j] = weight;
		(*G).Arcs[j][i] = (*G).Arcs[i][j];// 无向网的邻接矩阵沿对角线对称。
	}
	return 1;

}
int GetVertex(AMGraph* G)
{	
	for (int i = 0; i <(*G).Vexnum; i++)// 逐个输入顶点的值
	{	printf("输入顶点的值:\n");	
		get_first(&(*G),&(*G).Vexs[i]);
	}
}
int LocateVex(AMGraph* G,VerTexType v)//查找顶点在顶点数组中的下标
{
	if(sizeof(*G) == 0) return 0;
	for(int i = 0; i < MVN; i++)
	{
		if((*G).Vexs[i] = v)
			return i;
	}
	return 0;
}
int get_first(AMGraph* G, VerTexType* v1)//重大发现
{
	(*v1) = getchar();
	while(getchar() != '\n')
		continue;
	return 1;
}
int main()
{
	AMGraph G;
	CreateUDN(&G);
	return 0;
}

注解:

get_first()函数是用来规避输入一行文字之后连带换行符也一起算入,导致与第一个scanf临近的第二个scanf不能正常工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河锦绣放眼好风光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值