目录
前言
无论是什么程序都要和数据打交道,一个好的程序员会选择更优的数据结构来更好的解决问题,因此数据结构的重要性不言而喻。数据结构的学习本质上是让我们能见到很多前辈在解决一些要求时间和空间的难点问题上设计出的一系列解决方法,我们可以在今后借鉴这些方法,也可以根据这些方法在遇到具体的新问题时提出自己的解决方法。(所以各种定义等字眼就不用过度深究啦,每个人的表达方式不一样而已),在此以下的所有代码都是仅供参考,并不是唯一的答案,只要逻辑上能行的通,写出来的代码能达到相同的结果,并且在复杂度上差不多,就行了。
一、什么是十字链表
在上篇文章的最后,我们分析了邻接表的优劣,邻接表本身并没有什么大的缺陷,如果说有缺点,那么是对于有向图而言对同时表示一个顶点的出度和入度麻烦,因为需要有邻接表和逆邻接表同时表示,而且这种应用场景是存在的。十字链表就是为了使这个问题得到解决而出现的。
所以十字链表就是一种将邻接表和逆邻接表结合在一起的一种图的存储结构,它针对的就是有向图中出度和入度一起使用的情况,并且大大节省了内存。
二、认识十字链表
1.十字链表的组成
十字链表是由数组+链表的形式构成的,数组用来记录顶点的信息,链表用来记录弧(边)的信息。
在有向图中,顶点集的存储结构如下图所示
其中data是数据域,用于记录顶点的信息,而firstIn和firstOut是两个指针,指向的是以该节点为弧头(In)或弧尾(Out)的第一节点。
对于如此一个有向图而言,弧头和弧尾的概念是人为设置的,在这里我们假定一个顶点的入度指向弧头,出度的方向为弧尾
它的顶点数组应该这么表示,为了方便讲解,这里我们假定输入的值就是对应的下标,实际上应该通过用户输入的值在顶点数组中找到对应的下标
代码实现
//顶点集
typedef struct VexNode
{
//数据域
int data;
ArcBox* firstIn, *firstOut;//以该节点为弧头或弧尾的首节点
}VexNode;
在有向图中每一个顶点与之对应的弧,具体的弧的存储结构如下所示