数据结构——邻接多重表(C语言实现)

小弟最近在学数据结构,昨天自己实现了一下邻接多重表,写之前是有一点小问题的,本来想找一位大佬写的程序参考一下,但是并么有找到令人满意的,所以只能自己独立写了。小弟写这个程序全程只参考了课本中对邻接多重表的一些简单的文字描述,至于代码部分,全是小弟一个人写出来的,无任何参考,写的比较冗余,所以如果有大佬觉得小弟写的太拙劣的话,请嘴下留情,第一次在网上发文。

邻接多重表相较于邻接表大大节省了空间(一半),邻接多重表中定义相邻顶点的结构体时表示的并不是一个顶点,而是一条边由node_1到node_2的一条边,并且有两个指针域一个指针域属于node_1一个指针域属于node_2,他们两个不干扰,就像两条相邻的公路,一条公路上放node_1的车队,另一条公路上放node_2的车队(首先应该建立起邻接多重表的感觉),也正因此一个边节点可以供两个顶点使用
这是定义边节点的结构体
在这里插入图片描述
这是定义顶点节点的结构体,其中vex记录顶点数,edge记录边数,head结构体中记录各顶点的信息,和与其连接的链表的指针域
在这里插入图片描述

这是在网上找的一张邻接多重表的图片,各位可以理解一下
在这里插入图片描述
然后来讲一下这个程序的重难点!!!!!
请看上面的那个例图,我们随便找一条边,就v2到v5这条边吧,也就是(4,1)这条边,我们现在要做的是把该边挂载到v2节点和v5节点下,先简单一点,我们先把这条边挂载在v5下(挂载在与node_1值相同的顶点节点下),首先要判断v5下是否有挂载节点,判断无,则把该节点直接挂载在v5顶点节点的next中,这就挂载成功了。
接下来再挂载在v2下(挂载在与node_2值相同的顶点节点下),一样,先判断v2是否有挂载节点,判断有,用1(node_2)与v2的第一个节点(0,1)比较(先判断已挂载的边节点的node_1和node_2哪一个是要挂载的顶点v2)。发现已挂载的node_2与要挂载的node_2相同,再比较出要挂载的node_1(4)大于已挂载的node_1(0),进入node_2_pointer,再与(2,1)比较发现已挂载的node_2与要挂载的node_2相同,再比较出要挂载的node_1(4)大于已挂载的node_1(2),进入node_2_pointer,发现node_2_pointer为NULL则将(4,1)边节点,挂载在此指针域。对上述操作有疑惑的朋友可以看一下下面括号中的内容。
(------------------------------------------------------------------------------------------------------------------
因为是要插在与node_2相同的顶点节点下,所以要用要挂载的node_2进行如下判断:
第一种情况:若要挂载的边节点的node_2和已挂载的node_1相同,则比较要挂载的node_1和已挂载的node_2,若小,则将该边节点插入到该顶点节点的第一个(next),否则的话,结点指针进入已挂载节点node_1_pointer(为什么不进入node_2_pointer呢?因为上面已经比较出来要挂载的node_2与已挂载的node_1的值相同,所以进入node_1_pointer指针域),接着继续进行同样的操作(比较->判断大小->插入节点或进入指针域)。
第二种情况:若要挂载的边节点node_2与已挂载的node_2相同,则比较要挂载的node_1和已挂载的node_1,若小,则将该边节点插入到该顶点节点的第一个(next),否则的话,结点指针进入已挂载节点node_2_pointer,为什么进入该指针域,原因同上。接着继续进行同样的操作。
)--------------------------------------------------------------------------------------------------------------------

总的来说,插入有三种情况,
第一种情况:顶点头无挂载,或判断出已挂载的第一个边节点的邻节点大于要挂载的边节点的邻节点,则将该边节点插在顶点节点的next
第二种情况:判断出需要插在顶点节点的挂载链表中间
第三种情况:要挂载的边节点的邻节点大于所有的已挂载的边节点的邻节点
(因为情况太复杂,所以语言描述起来十分吃力,各位看起来也应该一样^ _ ^)
下面请各位看一下代码

#include<stdio.h>
//邻接多重表
#define MAX 20


struct Enode
{
   
	int node_1;
	int node_2;
	struct Enode* node_1_pointer;
	struct Enode* node_2_pointer;
};

struct AMLGraph
{
   
	int edge;
	int vex;
	struct
	{
   
		char head_ele;
		struct Enode* next;
	}head[MAX];
};

void show(struct AMLGraph* map);
void creat(struct AMLGraph* map);
void insert(struct AMLGraph* map, char node_1, char node_2);


void creat(struct AMLGraph* map)
{
   
	char node_1;
	char node_2;
	printf("要建立几个节点,几条边:");
	scanf("%d%d", &map->vex, &map->edge);
	getchar();
	for (int i = 0; i < map->vex; i++)
	{
   
		map->head[i].next = NULL;
		map->head[i].head_ele = i + 'A';
	}
	printf(
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值