图的矩阵表示法比较消耗空间,需要花费$ 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的:

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

b. 再添加B的:

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

c. 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)

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

  1. 链表list(链式存储结构实现)_数据结构知否知否系列之 — 线性表的顺序与链式存储篇(8000 多字长文)...

    从不浪费时间的人,没有工夫抱怨时间不够. -- 杰弗逊 线性表是由 n 个数据元素组成的有限序列,也是最基本.最简单.最常用的一种数据结构. 作者简介:五月君,Nodejs Developer,热爱技 ...

  2. 链表list(链式存储结构实现)_VOL.2 如何在python中实现链式存储结构

    一.前言 链式存储作为一种重要的数据存储方式有着极强的数据组织能力.灵活型和动态性,在众多数据结构中应用非常广泛.所谓链式存储结构,就是采用分散的存储空间分别存储每一组数据再通过地址链接的形式将全部数 ...

  3. 数据结构——链式存储结构

    文章目录 前言 一.链式存储结构 二.相关术语 1.结点 2.链表 3.单链表 4.双链表 5.循环链表 6.头指针 7.首元结点 三.单链表 1.单链表的实现 2.单链表的初始化 3.单链表的销毁 ...

  4. 数据结构和算法:(3)3.2线性表的链式存储结构

    线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...

  5. 数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...

    还记得数据结构这个经典的分类图吧: 今天主要关注一下线性表. 什么是线性表 线性表的划分是从数据的逻辑结构上进行的.线性指的是在数据的逻辑结构上是线性的.即在数据元素的非空有限集中 (1) 存在唯一的 ...

  6. 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)

    线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...

  7. 队列的链式存储结构及其实现_了解队列数据结构及其实现

    队列的链式存储结构及其实现 A queue is a collection of items whereby its operations work in a FIFO - First In Firs ...

  8. 栈的链式存储结构及实现

    今天学习栈的链式存储结构. 链式存储结构最大的好处就是没有空间的限制,通过指针指向将结点像一个链子一样把结点链接,那么栈的同样可以用于链式存储结构. 栈的链式存储结构,简称为链栈.想想看,栈只是栈顶来 ...

  9. 关于栈的链式存储结构

    之前在创建栈的链式存储结构时,想当然误以为栈的top指针会指向链表的尾结点,在创建链表结构时的写法误写为: for(j=0;j<i;j++){         temp=(struct Node ...

最新文章

  1. 火爆的图机器学习,2020年将有哪些研究趋势?
  2. 【小白的CFD之旅】13 敲门实例【续3】
  3. K8s 从懵圈到熟练 – 镜像拉取这件小事
  4. 上线到凌晨4点半 pagehelper的bug?
  5. s3c6410 nand初始化
  6. 做网店大家千万要注意
  7. Linux命令_用户,权限管理
  8. 动态代理解决网站字符集编码
  9. .Net免费公开课视频+资料+源码+经典牛逼 汇总篇【持续更新】
  10. cad批量页码lisp_源代码:批量改页码(加前缀)及提取属性块
  11. 64位java没有javaw.exe,2019-01-01 eclipse无法找到javaw.exe怎么处理
  12. kali android命令大全,让你的安卓设备跑起kali——kali for android
  13. 用amCharts插件实现树状图
  14. 免费微信小程序,发一发打造微信小程序Saas营销服务移动工具箱
  15. Robocup 2D新手导读(入门总结)
  16. DB2怎么根据开始和结束时间算相隔天数
  17. Cobertura计算覆盖率
  18. 来 CSDN 实习技术编辑,直面改变世界的技术与人物
  19. 解析程序化中的机器人的算法写作
  20. 计算机考研803学校,803计算机考研大纲

热门文章

  1. ArrayList源码解析——基于JDK1.8
  2. 嵌入式Linux能克隆,嵌入式Linux移植rz和sz命令
  3. 数据结构:Quick Power
  4. Python接弹珠小游戏源代码
  5. 迅雷产品经理:笔试,一面,HR面
  6. 老人防跌倒报警系统,及时防止跌倒给老人带来的伤害-新导智能
  7. 【计算机必备学习资源】
  8. 激光电视:扶不起的阿斗?
  9. 手游平台系统怎么和游戏发行商对接?
  10. Google Guava介绍