假设以邻接矩阵作为图的存储结构_图的存储

94810a2e1916bd1940914ac5299702a4.png

因为图的结构特点,使得其在存储、遍历也相对复杂一些。

邻接矩阵存储图

最简单的方式就是将图的顶点用一维数组存储进来,然后将边信息存储在二维矩阵中,这两个数组合称为图的邻接矩阵(Adjacency Matrix)。

2e1165ac32936164c553234380ebcdba.png
无向图的邻接矩阵

60e0008db6efe1b11ffe9bf00629eea0.png
有向图的邻接矩阵

邻接表存储图

看上图邻接矩阵的结构,可以得知邻接矩阵中的边数组中存在大量为零的空占位,浪费了大量空间,所以就自然而然想到利用链表来进行边的存储,这就是邻接表(Adjacency List)。

b2295b9f861cf7fbafbbcff137054f84.png
无向图的邻接表

18c9d972e8c7c07f3674634c5b28591a.png
有向图的邻接表

有向图邻接表的边表为以弧尾为链表表头进行存储的,这样对于顶点的出度统计较为方便,而有向图逆邻接表则正好与邻接表相反,边表是以弧尾作为链表表头的。

f0fc3e77e5c25101a76fe5b409825c79.png
有向图逆邻接表边表

78d7edef6cacb2a1df0a7c4e56e167a1.png
网的邻接表

邻接多重表存储无向图

假如对无向图的邻接表进行删除某边操作时需要对相关结点进行遍历找到相应边然后进行删除,比较麻烦,故邻接多重表对其进行改良。

边表结构:

2f27ca53978ea0dd9ab3506d6e85796e.png

其中,ivex和jvex为某边依附的两顶点在顶点表中的下标,ilink指向依附顶点ivex的下一条边,同理jlink指向依附顶点jvex的下一条边。

e37ead75159710294d7305c33cd1ef39.png
邻接多重表结构

十字链表存储有向图

用邻接表存储有向图存在一个问题,对于某一顶点的弧统计还是很麻烦的,邻接表对于顶点作为弧头的弧统计很麻烦,逆邻接表对于顶点作为弧尾的弧统计很麻烦。所以为了对顶点更好的查询,便参考线索二叉树的设计思路,得到了十字链表(Orthogonal List)。

顶点表的结构为:

ccd817412189bb9ba42ea6a2edf67e5a.png

边表结构为:

06b91f7cb7be60d651f7e600324c5426.png

其中,tailvex为弧尾在顶点表中的下标,headvex为弧头在顶点表中的下标,headlink指的是入边表指针域,指的是弧头相同的下一条边,taillink指的是出边表指针域,指的是弧尾相同的下一边。

7ce36c95356bc0b81c11da94810b1614.png
十字链表存储示意

图中实线为邻接表,虚线为逆邻接表。

边集数组存储图

ee596e10b1ee7ee9485382c2d5519a2e.png

注意和邻接矩阵进行区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值