6-4图-十字链表与邻接多重表

十字链表、邻接多重表

一.基础知识
十字链表:存储有向图
邻接多重表:存储无向图

二.进阶
1.十字链表(有向图)
(1)顶点结点
data:当前顶点,如A
firstin:指入(入度)
firstout: 指出(出度)在这里插入图片描述
(2)弧结点
A指向B:A→B(0→1)
A(0)为tailvex,起初作为顶点结点
B(1)为headvex,作为该弧结点的顶点,表示该结点的位号,B的位号就是1(我编的,方便下面讲画图)

firstout/tlink(绿色)往右画,表示指出(出度)
firstin/hlink(橙色)竖着画,表示指入(入度)
画到底置空

在这里插入图片描述
练习一下~
在这里插入图片描述
(画法不唯一)
画图步骤:
1.先画每个顶点的指出(出度),横着的全部画完
(1)A的第一个指出(按ABCD顺序)为B,第二个指出为C,横向依次连接,完成后tlink置空
(2)B无指出,直接将firstout置空
其他同理
2.画指入
(1)A的第一个指入为C,此时0号位的A找到第C行的0号位;A的第二个指入为D,接着画,找到第D行0号位
(2)B的第一个指入为A,此时1号位的B找到第A行1号位;B的第二个指入为D,接着画,找到第D行1号位
(3)C的第一个指入为A,此时2号位的C找到第A行2号位;C的第二个指入为D,接着画,找到第D行2号位
(4)D的指入为C,此时3号位的D找到第C行的3号位
3.将空着的部分画空


(3)空间复杂度O(|V|+|E|)
找到所有指出:横着(绿色,从firstout起经过tlink到NULL)
找到所有指入:竖着(橙色,从firstin起经过hlink到NULL)


2.邻接多重表(无向图)
(1)基本概念
在这里插入图片描述

在这里插入图片描述
与十字链表相似,但有所不同
在这里插入图片描述

(2)画图
邻接多重表画法不唯一,为了美观,下面提供一种画图方法
注:画图过程中一定注意不要画重复
在这里插入图片描述
画图步骤:
1.画出所有顶点结点
2.打框架
(1)A首先与B相连,画出01,并连一根线(A→01的线)
A又与D相连,画出03,不连线(至此第一行画完)
(2)B首先与A相连,AB框(01)已画出,不能重复话
B可以去连A,线往上画(先不画),此时B无需画框
即:第一条线是弯的,该节点此行不画框
(3)C首先与B相连,CB之间无框,画21框,并连一根线;
C又与D相连,画23框,不连线
C又与E相连,画24框,不连线
(4)D首先与C相连,线往上画,弯的,D一行不画框
(5)E首先与B相连,EB之间无框,画41框,并连一根线;
E又与C相连,此时CE框已经存在,不画
3.调整框架
第一行2个
第二行0个
第三行3个
第四行0个
第五行1个
即20301
调整为20202
注:0不参与调整
此时第2行变为21、23
第4行变为41、24

此时大体长这样
在这里插入图片描述
4.画线
第一根线是直的,所有画线从橙色框出
第一根线是弯的,所有画线从绿色框出
(原理参考图片上的定义)
(1)看橙色:A第二个与D相连,完成01到03连线
(2)看绿色:B第此时无线,从第一个开始连
B第一个与A相连,完成B到01连线
B第二个与C的1号位相连,完成01到21连线
B第三个与E的1号位相连,完成21到41连线
(3)看橙色:C第二个与D相连,完成21到23连线;
C第三个与E相连,完成23到24连线
(4)看绿色:D此时无线,从第一个开始连
D与A、C相连
顺序可换,就近原则,先C后A
D与C的3号位相连,完成D到23连线;
D与A的3号位相连,完成23到03连线
(5)看橙色:E第二个与C的4号位相连,完成41到24连线
5.没有线的ilink和jlink置空
在这里插入图片描述


(3)邻接多重表的删除操作
回顾:
ilink表示依附于顶点i的下一条边(橙色)
jlink表示依附于顶点j的下一条边(绿色)
沿箭头方向和固定颜色能找到与该顶点相连的所有顶点

(3.1)删除边
删除AB之间的边,即删除01
在这里插入图片描述
沿指针方向和颜色找到下一跳,并修改指针
看图:
A先指向B,再指向D,删除AB后,指针修改指向D
B先指向A,再指向C,删除AB后,指针修改指向C
看表:
A:删除01,沿橙色,修改指针指向03
B:删除01,沿绿色,修改指针指向21
在这里插入图片描述
(3.2)删除顶点
删除顶点e,同时删除相连的边
即删除41和24
在这里插入图片描述
E为最后一个,无下一跳,删除多余指针并将无线置空即可
在这里插入图片描述
(4)空间复杂度
空间复杂度:O(|V|+|E|)
不存在重复边,删除边、结点很方便

3.对比总结:邻接矩阵、邻接表、十字链表、邻接多重表
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡__卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值