数据结构8——图3,十字链表,邻接多重表
文章目录
前言
除了之前的邻接矩阵和邻接表
邻接表不唯一,在有向图中只记录出度
逆邻接表记录入度
一、十字链表
表示稀疏有向图
结合了邻接表和逆邻接表的思想
获取顶点的出边(从该顶点出发的边)和入边(指向该顶点的边)
- 通过为每个顶点维护两个链表来实现:一个链表用于存储从该顶点出发的所有边(出边),另一个链表用于存储到达该顶点的所有边(入边)。
结构
十字链表中的每个节点对应图中的一条边
- 顶点节点:包含顶点信息和两个指针。一个指针指向该顶点的第一个出边节点(如果有的话),另一个指针指向第一个入边节点(通过某个其他顶点指向该顶点的边)的表头节点(这通常是一个哑节点或哨兵节点,用于简化插入和删除操作)。
- 边节点:包含边的信息(如权重)、一个指向起始顶点节点的指针、一个指向下一条出边节点的指针(在同一起始顶点下),以及一个指向下一条入边节点的指针(这些入边都指向同一个终点顶点,但它们可能来自不同的起始顶点)。
例子
Vertex A:
Out: A -> B, A -> C
In:
Vertex B:
Out: B -> C
In: A -> B
Vertex C:
Out:
In: A -> C, B -> C
复杂例子
上图,按照上面简单例子的思路
先;列顶点,再列边,然后连线
二、邻接多重表(Adjacency Multilist)
每条边只存储一次,但是它会被链接到两个顶点的链表中,这两个顶点是边的两个端点。
- 把边的两个顶点存放在边表结点中,所有依附于同一个顶点的边串联在同一链表中。由于每条边依附于两个顶点,则每个边表结点同时链接在两个链表中。
例子
- 创建顶点节点
首先,为每个顶点创建一个顶点节点,每个节点包含一个指向其邻接边链表的指针。
- 创建边节点
为每条边创建一个边节点,每个边节点包含以下信息:
目标顶点: 目标顶点的标识或引用
边的权重(如果有)
下一个边节点的指针: 指向链表中的下一个边节点
3:. 更新邻接表
- 完整的邻接多重表结构
复杂的,上图,
重复的边不再建立节点,而是连接到之前的那个节点上