数据结构——十字链表
为了同时高效处理有向图的“出弧”和“入弧”操作,十字链表作为有向图的链式存储结构,融合了“出弧链表”与“入弧链表”的特性,能便捷地管理顶点的出度和入度。
十字链表
十字链表是专门为有向图设计的链式存储结构,它通过“顶点结点 + 弧结点”的组合,同时维护“以顶点为弧尾的出弧”和“以顶点为弧头的入弧”,让有向图的入度、出度操作都能高效执行。
1. 十字链表的结点结构
十字链表包含两种结点:弧结点(存储有向弧的信息)和顶点结点(存储顶点的信息及弧的连接入口)。
(1)弧结点
弧结点用于存储有向图的一条弧,包含5个域:
tailvex
:弧尾顶点的编号(即弧的起点编号);headvex
:弧头顶点的编号(即弧的终点编号);hlink
:指向弧头相同的下一条弧(用于串联所有以该顶点为弧头的弧);tlink
:指向弧尾相同的下一条弧(用于串联所有以该顶点为弧尾的弧);info
:存储弧的附加信息(如权值、标记等,可省略)。
(2)顶点结点
顶点结点用于存储顶点的基本信息及弧的连接入口,包含3个域:
data
:顶点的实际数据(如顶点名称、编号等);firstin
:指向以该顶点为弧头的第一条弧(即入弧的头指针);firstout
:指向以该顶点为弧尾的第一条弧(即出弧的头指针)。
2. 十字链表的存储示例(结合图6.9分析)
图6.9展示了有向图的十字链表表示,我们以图中结构为例,拆解存储逻辑:
- 图6.9(a)是有向图,包含顶点( V_1、V_2、V_3、V_4 ),弧的关系为:( V_1→V_2 )、( V_1→V_4 )、( V_3→V_1 )、( V_3→V_4 )、( V_4→V_3 )、( V_2→V_4 )(假设补充该弧,或按图中实际连接分析)。
- 图6.9(b)是其十字链表表示:
- 顶点结点按顺序存储(( V_1 )对应下标0,( V_2 )对应1,( V_3 )对应2,( V_4 )对应3)。
- 顶点( V_1 )(下标0)的
firstout
指向弧结点( (0,1) )(弧尾0即( V_1 ),弧头1即( V_2 )),该弧的tlink
指向弧结点( (0,3) )(弧尾0,弧头3即( V_4 )),表示( V_1 )的出弧为( V_1→V_2 )和( V_1→V_4 ); - 顶点( V_3 )(下标2)的
firstout
指向弧结点( (2,0) )(弧尾2即( V_3 ),弧头0即( V_1 )),该弧的tlink
指向弧结点( (2,3) )(弧尾2,弧头3即( V_4 )),表示( V_3 )的出弧为( V_3→V_1 )和( V_3→V_4 ); - 顶点( V_4 )(下标3)的
firstout
指向弧结点( (3,2) )(弧尾3即( V_4 ),弧头2即( V_3 )),表示( V_4 )的出弧为( V_4→V_3 );同时,弧结点( (0,3) )的hlink
指向弧结点( (2,3) )(弧头3相同),表示以( V_4 )为弧头的入弧有( V_1→V_4 )和( V_3→V_4 ); - 顶点( V_2 )(下标1)的
firstout
指向弧结点( (1,3) )(弧尾1即( V_2 ),弧头3即( V_4 )),表示( V_2 )的出弧为( V_2→V_4 )。
通过hlink
和tlink
的串联,十字链表将“同弧头的入弧”和“同弧尾的出弧”分别组织成链表,让入度、出度的遍历都能高效进行。
3. 十字链表的特点与应用
十字链表的设计让有向图的入度、出度操作都具备高效性,其核心特点如下:
(1)操作效率
- 求顶点的出度:遍历该顶点
firstout
指向的tlink
链,时间复杂度为( O(d_{\text{out}}) )(( d_{\text{out}} )为出度); - 求顶点的入度:遍历该顶点
firstin
指向的hlink
链,时间复杂度为( O(d_{\text{in}}) )(( d_{\text{in}} )为入度); - 增删弧:只需在对应
hlink
或tlink
链中插入、删除弧结点,时间复杂度为( O(1) )(找到位置后)。
(2)空间复杂度
十字链表的空间复杂度为( O(n + e) )(( n )为顶点数,( e )为弧数),与邻接表相当,但功能更全面。
(3)适用场景
十字链表特别适合需要同时处理入度和出度的有向图应用,例如:
- 有向图的拓扑排序:需频繁判断顶点的入度是否为0;
- 关键路径(AOE网):需同时遍历入弧和出弧来计算事件的最早、最晚发生时间;
- 有向图的强连通分量分析:需同时处理顶点的入边和出边。
综上,十字链表通过“双链表”(hlink和tlink)的设计,巧妙地将有向图的入弧和出弧分别组织,既保证了空间的高效利用,又让入度、出度相关操作的效率大幅提升,是有向图链式存储的“全能型”方案。结合图6.9的示例,能直观理解“顶点-弧结点”的关联逻辑,为后续有向图的复杂应用奠定了存储基础。