数据结构——十字链表(C语言实现)

十字链表是将邻接表和逆邻接表结合在一起的一种有向图的数据结构

十字链表的节点结构体表示的是一个节点到另一个节点的边,并且此由指出节点(from)和指入节点(to)共同使用,因此大大节省了内存。
先直观感受一下十字链表的存储方式,观察一下规律
在这里插入图片描述
在这里插入图片描述

接下来看一下我定义的边节点的结构体,两个数据域表示from到to的边,两个指针域其实可以看做将该节点挂去何处,in_pointer就是将该节点挂在to顶点的入度链表中,out_pointer就是将该节点挂在from顶点的出度链表中
在这里插入图片描述
这是我定义的十字链表结构体,其中包含该图的顶点数与边数,并且包含了顶点结构体head,其中包含了顶点的元素信息,和入度与出度指针变量
在这里插入图片描述

其实原理很简单,就是有一条from到to的边节点,现在把这个边节点先插入到from的出度链表下再插到to的入度链表下。

下面随便用个有向图举下例子:
在这里插入图片描述
找个DA边(由D指出到A),先将该边节点插到D(from)的出度链表中,第一步先在D顶点中判断其出度链表是否为空,若为空,直接将此节点插入D顶点的出度指针变量中(map->head[from].out_pointer)
若不为空则用to与D下出度链表中已挂载的节点的to比较大小,判断是进入下一个节点还是插在此节点之前。第二步再将该边节点插入到A(to)的入度链表中,过程同上。
总的来说十字链表并不算复杂,各位可以先一下我用C语言实现的代码

#include<stdio.h>
//十字链表(有向图的存储方式)
//节点结构体中有两个指针,一个连接出度,一个连接入度
#define MAX 20
//from到to的边要插到from的出度链表中,to的入度链表中
struct Node
{
   
   
	int from, to;
	struct Node* in_pointer;
	struct Node* out_pointer;
};

struct Cross_List//一个图的结构体中应包含图的顶点数和边数
{
   
   
	int vex, edge;
	struct
	{
   
   
		char head_ele;
		struct Node* in_pointer;
		struct Node* out_pointer;
	}head[MAX];

};

void creat(struct Cross_List* map);
void show(struct Cross_List* map);
void insert(struct Cross_List* map, char from, char to);

void creat(struct Cross_List
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值