多重邻接表的建立

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define MVNUM 50


typedef bool VisitIf;
typedef char VerTex;

typedef struct ArcNode
{
	VisitIf visitIf;
	int ivex;
	int jvex;
	struct ArcNode* ilink;
	struct ArcNode* jlink;
}ArcNode;

typedef struct VexNode
{
	VerTex vex;
	ArcNode* firstArc;
}Vex[MVNUM];

typedef struct
{
	Vex Vertrices;
	int vexnum;
	int arcnum;
}AMLGraph;

void CleanCache()
{
	char ch;
	while ((ch = getchar()) != '\n' && ch != EOF);
}

int GetIndex(AMLGraph &G, VerTex vex)
{
	for (int i = 0; i < G.vexnum; i++)
	{
		if (vex == G.Vertrices[i].vex)
		{
			return i;
		}
	}
	return -1;
}

ArcNode* CreateArcNode()
{
	ArcNode* newnode = (ArcNode*)malloc(sizeof(ArcNode));
	if (NULL == newnode)
	{
		printf("分配内存失败!\n");
		exit(-1);
	}
	return newnode;
}

void CreateUDM(AMLGraph &G)
{
	printf("请输入顶点和边个数:\n");
	scanf_s("%d%d", &G.vexnum, &G.arcnum);

	for (int i = 0; i < G.vexnum; i++)
	{
		printf("请输入第%d个节点的信息:\n", i + 1);
		CleanCache();
		scanf_s("%c", &G.Vertrices[i].vex, 1);
		G.Vertrices[i].firstArc = NULL;
	}

	for (int k = 0; k < G.arcnum; k++)
	{
		printf("请输入第%d条边的信息:\n", k + 1);
		CleanCache();
		VerTex ctemp1;
		VerTex ctemp2;
		scanf_s("%c%c", &ctemp1, 1, &ctemp2, 1);
		int i = GetIndex(G, ctemp1);
		int j = GetIndex(G, ctemp2);

		ArcNode* arcNode = CreateArcNode();
		arcNode->visitIf = false;
		arcNode->ivex = i;
		arcNode->ilink = G.Vertrices[i].firstArc;
		G.Vertrices[i].firstArc = arcNode;

		arcNode->jvex = j;
		arcNode->jlink = G.Vertrices[j].firstArc;
		G.Vertrices[j].firstArc = arcNode;
	}
}

void PrintUDM(AMLGraph& G)
{
	for (int i = 0; i < G.vexnum; i++)
	{
		printf("顶点:%c\n", G.Vertrices[i].vex);

		printf("邻接点:");
		ArcNode* ptemp = G.Vertrices[i].firstArc;
		while (ptemp)
		{
			if (ptemp->ivex == i)
			{
				printf("%4c", G.Vertrices[ptemp->jvex].vex);
				ptemp = ptemp->ilink;
			}
			else
			{
				printf("%4c", G.Vertrices[ptemp->ivex].vex);
				ptemp = ptemp->jlink;
			}
		}
		printf("\n");
	}
}

int main(void)
{
	AMLGraph G;

	CreateUDM(G);

	PrintUDM(G);

	return 0;
}
没有注释,大家应该看不懂吧。可以先去看完其他文章理解一下多重邻接表的原理再看应该就可以理解啦。
对任意给定的图(顶点数不小于20,边数不少于30,图的类型可以是有向图、无向图、有向网、无向网),能够输入图的顶点和边(或弧)的信息,并存储到相应存储结构(邻接矩阵、邻接表、十字链表、邻接多重表,任选其中两种类型),对自己所创建的图完成以下操作: 对无向图求每个顶点的度,或对有向图求每个顶点的入度和出度(5分) 完成插入顶点和边(或弧)的功能(5分) 完成删除顶点和边(或弧)的功能(5分) 两种存储结构的转换(5分),如果其中一种存储结构为十字链表或邻接多重表则增加5分。 输出图的深度优先遍历序列或广度优先遍历序列(5分) 求图的深度优先或广度优先的生成树(或生成森林)(存储结构为孩子-兄弟链表),并对生成树进行遍历(15分) 判断图的连通性,输出连通分量的个数(5分) 判断图中是否存在环,无向图5分,有向图10分 给出顶点u和v,判断u到v是否存在路径(5分) 10、求顶点u到v的一条简单路径(10分) 11、求顶点u到v的所有简单路径(15分) 12、求顶点u到v的最短路径(10分) 13、求顶点u到其余各顶点的最短路径(15分) 14、求任两个顶点之间的最短路径(15分) 15、求最小生成树(15分) 16、对于有一个源点和一个汇点的有向网,求关键路径(20分) 编程环境可以是C、VC++、JAVA,每位同学从上述题目中选择100分的题目,注意,必须选择第1-6题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值