m数据结构 day13 图(二)五种存储结构(邻接矩阵,邻接表,十字链表,邻接多重表,边集数组)

图的存储结构:比线性表和树更复杂,完全不能用顺序结构

终于弄明白为啥要先学线性表,再学树,再学图了。因为他们各方面的复杂性都是递增的,比如存储方式即存储结构的设计上,基本操作上。线性表要么顺序存储要么链式存储,而树基本都是采用链式存储,二叉链表的形式,用孩子兄弟表示法,但是也比现行表复杂很多了;图则更复杂。

复杂在哪里呢?图的任意一个顶点都可以作为第一个顶点,且一个点的邻接点之间也没有次序关系。比如下图,实际上四个图都是同一个图,但是看起来却有点不一样:
在这里插入图片描述

点在内存中的位置完全没办法说明点之间的逻辑关系,所以完全不能用顺序结构来存储图。

那么多重链表呢?即结点有多个指针域的链表。每个顶点有一个数据域,多个指针域。但是就像之前在树中讨论的那样,指针域的个数很难确定,每个顶点的度数不一样,要么让每个顶点的指针域个数都等于图的最大顶点度数,这样很浪费空间;要么让每个点的指针域个数等于自己的度,但是需要每个结点单独拿一个数据说明指针域个数,这样会使得整个多重链表混乱不统一,不便于处理。

所以图的物理存储是个难题,但是前辈们已经给出了五种不同的解决方案:邻接矩阵,邻接表,十字链表,邻接多重表,边集数组。

邻接矩阵,邻接表,十字链表都用了一个一维数组存储顶点,即都用了顺序存储结构,但是数组元素结点的结构体的设计不一样。

邻接矩阵只用了两个数组,一个一维一个二维,完全不涉及动态分配内存,是静态的存储方式。但不能说是顺序存储哦,因为顺序存储只适合一维数组(一对一,前驱后继,用物理的顺序存储逻辑关系),二维数组并不是顺序存储。

邻接矩阵(不涉及动态存储):用两个数组表示图,一个一维数组存顶点,一个二维数组(即邻接矩阵)存边

即一个顶点数组,一个边数组,这个二维的边数组就是邻接矩阵adjacent matrix

无向图:邻接矩阵是对称矩阵,行和是顶点的度

无向图的边数组是一个对称矩阵
在这里插入图片描述
在这里插入图片描述

求点 v i v_i vi的邻接点,就遍历第i行,所有 a r c [ i ] [ j ] arc[i][j] arc[i][j]为1的 v j v_j vj就是邻接点。

有向图:邻接矩阵不对称,行和是出度,列和是入度

在这里插入图片描述
只要 a c r [ i ] [ j ] = 1 acr[i][j]=1 acr[i][j]=1 v i v_i vi v j v_j vj之间有有向边。

要找 v i v_i vi的邻接点,就遍历第i行,满足 a c r [ i ] [ j ] = 1 acr[i][j]=1 acr[i][j]=1的点就是邻接点。

网:用一个不可能的值表示不存在的边的权

在这里插入图片描述
下面是一个有向网
在这里插入图片描述

代码

表示图的结构体的代码

typedef 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值