图论:十字链表的基本概念理解

<写博客是为了学习理解更深刻>

        在学习甲鱼课的十字链表时稍稍有点懵,进C站查找一番后发现也没有比较亲近小白的描述和解释。抱着让自己理解更深刻以及与大家分享的态度写下了这篇博客。如有错误请指出。

十字链表的引入:

        邻接表的使用简单方便,但在对有向图的处理上,单邻接表只能表示出度(如图1)

但在特定情况,需要关注点的入度,则需要再建立一个逆邻接表。

818259a9cddb48febe4b002a1fb1f3ec.jpeg                                        436f9b0132f9420b9e66492047bec836.jpeg

 (图1)A的邻接表,表示出边表                                                            (图2)A的入边表与出边表

因此,不妨将邻接表和逆邻接表结合起来,由此创造出十字链表,既能表示入度,也能表示出度。(图2,是不是很十字?)

十字链表的构造方法:

①重新定义表头结构

        只需对表头结构稍加改动,增加firstIn和firstOut两个指针域,分别指向以A为弧尾和以A为弧头的第一个顶点地址。这样通过对in、out两指针域迭代检索,就能获取入度和出度。(可对比观察图一,图二的头结构帮助理解)

data firstIn firstOut

data:顶点的数据                  firstIn:第一个入边表的指针        firstOut:第一个出边表的指针

②重定义边表的节点结构       

(邻接表除去头结点的链表结构,每个结点都表示一条边,因此叫边表)

        边表每个结点结构如下:

        tailvex:弧起点的下标           headvex:弧终点的下标        headlink:入边指针        taillink:出边指针

tailVex headVex headLink tailLink

每个结点都包含一条完整边的信息  tailvex->headvex;  下一条入边的地址headlink;下一条出边的地址taillink。

通过对四个域的填充即可形成十字链表。

                        有点抽象,举个具体例子帮助理解:

        1.图如左下角所示,根据步骤①建立好顶点结构

        2.建立如②所示的节点结构,与邻接表建立方式相同,将firstOut指针域指向第一条出边,再依次填充tailLink指针域,完善出边表。

751fd6eebaa943119e59295e76571d24.png(有点小丑 T_T)

        3.与建立逆邻接表方式相同,将firstIn指针域指向第一条入边地址,再依次填充headLink指针域,完善入边表。

 6154ee5ee0b646d4b62f4372ce132e69.png(以V0为例)

        4.最终形成了其他帖子里那种杂乱的十字链表图

fdb14eab87c9442e81673eb33aa19527.png(图截自bilibili鱼C-小甲鱼的《数据结构和算法》)

如此,十字链表建立完成。用一个表,即可得出图内每个顶点的入度和出度。

猜你喜欢

转载自blog.csdn.net/m0_67441224/article/details/126539668
今日推荐