20.0、C语言数据结构——图的存储结构

图的存储结构相比较线性表与树来说就复杂很多了;

1. 我们回顾下,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放;树结构是一对多的关系,所以我们要将数组和链表的特性结合在一起才能更好的存放;

2. 那么我们的图是多对多的情况,另外图上的任何一个顶点都可以被看做是第一个顶点,任意顶点的邻接点之间不存在次序关系;

3. 因为任意两个顶点之间都可能存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系(内存物理位置是线性的,图的元素关系是平面的);

4. 如果用多重链表来描述倒是可以做到,但在几节课前的树章节我们已经讨论过了,纯粹用多重链表导致的浪费是无法想象的(如果各个顶点的度数相差太大,就会导致浪费);

        1. 考虑到图是由顶点和边或弧两部分组成的,合在一起比较困难,那就很自然的考虑到分为两个结构来分别存储;

2. 顶点因为不区分大小,主次,所以用一个一维数组来存储是很不错的选择;

3. 而边或弧由于是顶点与顶点之间的关系,一维数组肯定就搞不定了,那我们不妨考虑一个二维数组来存储;

  图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图;一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息;

我们可以设置两个数组,顶点数组为vertex[4] = { v0,v1,v2,v3 } ,边数组 arc [ 4 ] [ 4 ] 为对称矩阵(0表示不存在顶点间的边,1表示顶点间存在边);

对称矩阵:

所谓对称矩阵就是n阶矩阵的元满足 a [ i ] [ j ]  == a [ j ] [ i ];即从矩阵的左上角到右下角的主对角线为轴,右上角的元与左下角相对应的元全都是相等的;

有了这个二维数组组成的对称矩阵,我们就可以很容易的知道图中的信息:

        - 要判定任意两顶点是否有边无边就非常容易了;

- 要知道某个顶点的度,其实就是这个顶点 Vi 在邻接矩阵中第 i 行(或第 i 列)的元素之和;

- 求顶点 Vi 的所有邻接点就是将矩阵中第 i 行元素扫描一遍, arc [ i ] [ j ] 为 1 就是邻接点;

        无向图的边构成了一个对称矩阵,貌似浪费了一般的空间,那如果是有向图来存放,会不会把资源都利用的很好呢?

 

可见顶点数组 vertex [ 4 ] = {V0,V1,V2,V3},弧数组arc [ 4 ] [ 4 ] 也是一个矩阵,但因为是有向图,所以这个矩阵并不对称,例如由 V1 到 V0 有弧,得到 arc [ 1 ] [ 0 ] = 1,而 V0 到 V1 没有弧,因此arc [ 0 ] [ 1 ] = 0;

另外有向图是有讲究的,要考虑入度和出度,顶点 V1的入度为 1,正好是第 V1 列的各数之和,顶点 V1 的出度为 2 ,正好第 V2 行的各数之和;

在图的术语中,我们提到了网这个概念,事实上也就是每条边上带有权的图就叫网;

 

这里 ∞ 表示一个计算机允许的,大于所有边上权值的值;

图的存储结构 -> 邻接表

邻接矩阵看上去是个不错的选择,首先是容易理解,第二是索引和编排都很合理;

但是我们也发现,对于边数相对顶点较少的图,这种结构无疑是存在对存储空间的极大浪费;

 

因此我们可以考虑另外一种存储结构方式,例如把数组与链表结合一起来存储,这种方式在图结构也适用,我们称为邻接表(AdjacencyList);

邻接表的处理方法是这样:

- 图中顶点用一个一位数组存储,当然顶点也可以用单链表来存储,不过数组可以较容易的读取顶点的信息,更加方便;

- 图中每个顶点 Vi 的所有邻接点构成一个线性表,由于邻接点的个数不确定,所以我们选择用单链表来存储;

若是有向图,邻接表结构也是类似的,我们先来看下把顶点当弧尾建立的邻接表,这样很容易就可以得到每个顶点的出度:

但也有时为了便于确定顶点入度或以顶点为弧头的弧,我们可以建立有向图的逆邻接表:

此时我们很容易就可以得出某个顶顶啊的入度或出度是多少,判断两顶点是否存在弧也很容易实现;

对于带权值的网图,可以在边表结点定义中在增加一个数据域来存储权值即可:

20.0、C语言数据结构——图的存储结构相关推荐

  1. 数据结构——图(存储结构)

    数据结构--图 图的定义和基本术语 图的类型定义 图的存储结构 数组(邻接矩阵表示法) 网(即有权图)的邻接矩阵表示法 邻接表 邻接表表示法(链式) 图的邻接表存储表示 采用邻接表表示法创建无向网 邻 ...

  2. 数据结构--图的存储结构

    系列文章目录 第九话  数据结构之图的存储 文章目录 一.了解什么是图 二.图的定义和基本术语 三.存储结构之邻接矩阵 1.邻接矩阵的介绍 2.邻接矩阵的创建 3.主函数中实现 四.存储结构之邻接表 ...

  3. 数据结构——图的存储结构

    邻接矩阵法 通过矩阵来表示所有的 有向图的邻接矩阵法 无向图的邻接矩阵法 无向图的矩阵一定是对称的,可以才用压缩存储方式 网的邻接矩阵法 网就是带权值的图,所以数组里面直接放权值,不存在的边用正无穷表 ...

  4. 数据结构——图:极大小连通子图、图的存储结构、图的遍历

    图的基本概念: 极大连通子图就是连通分量. 极大连通子图与连通分量在无向图(undirected graph)这个前提下是等同的概念. 极小连通子图: 减去任何一条边就不再连通. 不管树还是二叉树:n ...

  5. 数据结构之图的存储结构一及其实现

    图的存储结构 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系,即图没有顺序映像的存储结构,但可以借助数组的数据类型表示元素之间的关系. ...

  6. 【数据结构——图和图的存储结构】

    目录 一.图的定义和基本术语(Graph) (一)图的定义 (二)图的基本术语 一.图的存储结构 (一)邻接矩阵(Adjacency Matrix) 1.无向图的邻接矩阵 2.有向图的邻接矩阵 3.网 ...

  7. 数据结构考研笔记(十五)——图的存储结构邻接矩阵、邻接表、十字链表、临界多重表的概念

    图的存储结构 1.邻接矩阵 1.1有向图 1.2无向图 2.邻接表法 2.1有向图边表 2.2无向图边表 3.十字链表 4.临界多重表 十字链表与临界多重表 1.邻接矩阵 邻接矩阵法结点数为n的图G ...

  8. 数据结构之图的存储结构:邻接多重表

    图的存储结构:邻接多重表 产生条件: 邻接多重表的定义: 邻接多重表的代码定义: 删除: 性能分析: 十字链表与邻接多重表的对比 产生条件: 当用邻接矩阵法存储时:空间复杂度为O(|V|^2),太大 ...

  9. 数据结构之图的存储结构:十字链表法

    图的存储结构:十字链表法 思维导图: 产生条件: 十字链表法的定义: 十字链表法的代码定义: 性能分析: 思维导图: 产生条件: 当用邻接矩阵存储时:空间复杂度为O(|v|^2),太大 当用邻接表法存 ...

最新文章

  1. 电话双音频拨号声音中的干扰信号
  2. 分享几个vs code 的几个插件
  3. 使用QEMU创建虚拟机
  4. OpenStack Days走进北京 主角是用户
  5. java获取注解信息_java 自定义注解,获取注解信息
  6. import导入模块
  7. HDU 4701 Game
  8. 8 reasons why SPIR-V makes a big difference
  9. MySQL优化SQL性能问题
  10. python开发怎么成长_成长路线图:如何成为一名Python开发者?
  11. From Apprentice To Artisan 翻译 17
  12. 删除windows server backup备份
  13. SharePoint【Site Definition 系列】-- 05. List Definition与List Template之比较
  14. 小米路由器r1d刷第三方_好物推荐 篇三:服役多年的小米路由器R1D准备让他退休, 小米路由R3D开始上岗...
  15. 基于FPGA(cyclone IV)的NOR FLASH的应用
  16. 后盾网Laravel 5.2开发实战视频
  17. C语言每日一练——第66天:委派任务问题
  18. 英式音标26字母(U-Z)
  19. 景联文科技—专业数据采集公司和智能数据管理执行一体化平台
  20. Linux操作系统安装及服务控制

热门文章

  1. 杉数科技:不走捷径的“解”题高手
  2. 夫妻、情侣必看,《半个西瓜》
  3. 简单C#代码制作 动画播放绑定进度条
  4. 海量遥感数据处理与GEE云计算
  5. Premiere快餐甜品餐饮美食视频PR模板MOGRT
  6. 使用Advanced Installer 打包Revit插件
  7. python是谁_Python逻辑推理:三对情侣到底谁和谁结婚
  8. 华为鸿蒙系统覆盖机型,华为公布升级计划:鸿蒙OS系统开始推送,覆盖百款机型...
  9. windows10 AppStore安装 应用商店重新安装
  10. 关于enhancement的学习笔记