图的链式存储结构解析(邻接表、逆邻接表、十字链表、邻接多重表)

图的矩阵表示法比较消耗空间,需要花费$ n 2 n^2 n2$个单元存储边(弧)。在边数较少的情况下比较浪费。我们这里来讨论图的链式存储结构。

图的链式结构主要有四类:邻接表、逆邻接表、十字链表、邻接多重表。

前两个算比较好理解的,后两个更复杂一点。

邻接表


实际上邻接表都是使用数组来存储顶点,然后对每一个顶点建立一个单链表,第i个但链表中的节点表示依附于顶点vi的边(对有向图是以vi为尾的弧)。以下分类只是一些很细微的区别。

无向图的邻接表

对无向图来说第i个单链表中的结点表示依附于顶点vi的边。

在G的邻接表中,同一条边对应两个结点。
无向图G的邻接表,顶点vi的度为第i个单链表的长度。
若无向图G有n个顶点和e条边,需n个表头结点和2e个表结点

无向图邻接表

有向图的邻接表

第i个单链表中的表结点,表示以顶点vi为尾的弧(vi,vj)的弧头

若有向图G有n个顶点和e条弧,则需n个表头结点和e个表结点。
有向图G的邻接表,顶点vi的出度为第i个单链表的长度。
求顶点vi的入度需遍历全部单链表,统计结点值为i的结点数。

有向图的邻接表

逆邻接表

逆邻接表也很好理解,只是将出度改为入度了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IkD5A5T-1625671611460)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210705235744239.png)]

十字链表


存储结构

十字链表相当于将邻接表和逆邻接表合并而成。

画的时候以邻接表为基础,扩展结点属性成起止结点序号。再添加逆邻接表信息。

十字链表基本结构解析如下:

十字链表结构

构造十字链表

我们以如下有向图为例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h0oIdfKi-1625671611461)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210706001104639.png)]

这里我们需要把所有的边先列出来:

十字链表所有边

注意一个细节,这里面的边是按照坐标排的这个很重要,等一会儿画指向相同弧头的线以及各种有关线的时候很方便使用。直接从上往下一笔画出来就可。

我们先画出所有的firstout和弧尾相同的指针:

第一步

如图,直接按照这种每一行都画到底,最后一个为空。

而后再画出firstin和弧尾相同的线指针:

a. 首先添加A的:

A

由于以1为弧尾的只有一个边,所以不需要再画与其弧尾相同的线。

b. 再添加B的:

B

这里可以看出来,直接找到第一个之后,一路往下走就是与其弧尾相同的线了,操作非常方便。

c. C与D的就一起画了,这个就不多说,相对而言是非常简单的

C\D

十字链表结构性质

① 顶点结点数=顶点数 弧结点数=弧的条数
② 求入度:从顶点Vi的firstin出发,沿着弧结点中的hlink所经过的弧结点数。
求出度:从顶点Vi的firstout出发,沿着弧结点中的tlink所经过的弧结点数。

邻接多重表


邻接多重表和十字链表类似,只是其中的弧头弧尾节点概念替换为“与结点i、结点j相关联的边”,它主要是用来存储无向图的。

存储结构

其基本存储结构如下:

邻接多重表结构

构造邻接多重表

邻接多重表的画法是不唯一的,它的边结点的是可以随意改起点终点的。所以临界多重表的画法还是很灵活的。

接下来我们给出图例,实际上思路和十字链表是非常类似的,我们最好每一个弧结点也都按照其“坐标”位置画,以以下图为例:

邻接多重表

尽量平均分配边到每一个顶点中,保持美观,最终得到的邻接多重表如下:

邻接多重表

oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xSWTg5NzU3,size_16,color_FFFFFF,t_70)

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值