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

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

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

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

目录

  • 邻接表
    • 无向图的邻接表
    • 有向图的邻接表
    • 逆邻接表
  • 十字链表
    • 存储结构
    • 构造十字链表
    • 十字链表结构性质
  • 邻接多重表
    • 存储结构
    • 构造邻接多重表

邻接表


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

无向图的邻接表

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

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

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

有向图的邻接表

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

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

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

逆邻接表

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

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

十字链表


存储结构

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

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

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

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

构造十字链表

我们以如下有向图为例:

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

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

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

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

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

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

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

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

a. 首先添加A的:

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

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

b. 再添加B的:

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

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

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

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

十字链表结构性质

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

邻接多重表


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

存储结构

其基本存储结构如下:

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

构造邻接多重表

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

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

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

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

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

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

你可能感兴趣的:(数据结构,数据结构,有向图,链表,算法,单链表)