首页/数据结构/05-graph/邻接多重表和十字链表 🔗 在 Obsidian 中打开
数据结构 · 05-graph

邻接多重表和十字链表

重要度 ⭐⭐ 邻接多重表十字链表图的存储边表
速查
邻接多重表:无向图高效存储,每条边只存一次(ilink/jlink 链接两端),删边方便。十字链表:有向图高效存储,hlink 入边链、tlink 出边链,入度出度都能直接查。

邻接多重表(无向图)

邻接表存无向图时每条边存了两次(两端点各一次),删除边/顶点不方便。邻接多重表用每个边结点表示一条边:

边结点:
┌─────┬─────┬───────┬───────┬───────┬───────┐
│mark │ivex │ilink  │jvex   │jlink  │info   │
└─────┴─────┴───────┴───────┴───────┴───────┘
  • ivex, jvex:边的两个顶点;
  • ilink:依附于 ivex 的下一条边;jlink:依附于 jvex 的下一条边;
  • mark:访问标记;info:边信息(权值)。

顶点结点仅 data + firstedge(指向第一条依附边)。示例图 0-1、0-2、1-2、1-3、2-3 的邻接多重表:

[0] → edge(0,1) → edge(0,2)
[1] → edge(0,1) → edge(1,2) → edge(1,3)
[2] → edge(0,2) → edge(1,2) → edge(2,3)
[3] → edge(1,3) → edge(2,3)

十字链表(有向图)

邻接表查出度方便,查入度要遍历整表。十字链表同时存出边与入边,每个弧结点

弧结点:
┌─────┬───────┬───────┬───────┬───────┐
│tailvex│headvex│hlink │tlink  │info   │
└─────┴───────┴───────┴───────┴───────┘
别记反tailvex 弧尾、headvex 弧头。hlink = 弧头相同的下一条弧(入边链);tlink = 弧尾相同的下一条弧(出边链)。顶点结点含 data + firstin + firstout,分别链出入弧与出弧。

查入度、出度都只需遍历对应链表 —— 相当于把邻接表 + 逆邻接表合并

常见考法

考点说明
结构识别给定图,画出邻接多重表或十字链表
边操作在邻接多重表中删除某条边
度的计算在十字链表中求入度 / 出度

易错点

易错清单
  • 邻接多重表中每条边只有一个边结点(不像邻接表存两次)。
  • 十字链表中 hlink入边链tlink出边链,别搞反。
  • 这两种结构以概念题为主,不太会要求手写完整代码。

核心结论

  1. 邻接多重表解决无向图中边的重复存储问题。
  2. 十字链表解决有向图中入度计算效率低的问题。
  3. 两者都是邻接表与逆邻接表合并的产物。
  4. 考试重点是理解结构、会画图,不要求代码实现。

记忆卡片

邻接多重表解决什么问题?
无向图每条边存两次的问题,方便边/顶点的删除。
十字链表解决什么问题?
有向图入度计算效率低,合并了邻接表与逆邻接表。
hlink 和 tlink 的含义?
hlink 入边链(同弧头),tlink 出边链(同弧尾),别搞反。
两者的考试要求?
以概念题为主,理解结构、会画图即可,不要求代码。

交互动画 · 邻接多重表(无向图)

同一颜色 = 同一个边结点(每个边结点被两个顶点链共享,仅存一次) 0 1 2 3 无向图 5 条边 V0V1V2V3 0 1 2 3 0,1 0,2 0,1 1,2 1,3 0,2 1,2 2,3 1,3 2,3 每条边只出现为 一个边结点(5 个) ilink/jlink 挂到 两个顶点的链上
邻接多重表:5 条边各一个边结点,由两端顶点链共享
点按钮:点亮某顶点的依附边、删除边、或与邻接表对比
边结点数 = e(格外节省,不是 2e);删除边只需断开两条链、释放一个结点。

相关知识点

graph-traversal-and-applications mst-and-shortest-path

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。