图的存储结构

前言

从图的定义可知,一个图包括两部分:顶点信息和描述顶点之间关系的信息。 因此无论采用什么方法建立图的存储结构,都要完整、准确的反映这两方面的信息。图的结构有多种:
学习内容
在这里插入图片描述

一、邻接矩阵【顺序存储(数组)】

这种存储结构中,用一个一维数组存放顶点的信息,用一个二维数组存放顶点和顶点之间关系(边或者弧)的信息,这个信息就称为图的邻接矩阵。

1、图的数组表示法存放邻接矩阵

无向图中两节点之间有边,数组中就填1;没有就填0
有向图中两节点之间 有向边的起点填1;
有向图中A->B 称为 A邻接到B
在这里插入图片描述

2、无向图和有向图的示例

在这里插入图片描述
如何通过邻接数组获取顶点的度?
在这里插入图片描述
无向图获取顶点的度:遍历矩阵的相关顶点的一行或者一列中非0元素的个数;
有向图获取顶点的度:出度遍历一行,入度遍历一列,统计非0元素个数,则为其度;

3、邻接矩阵(带权图/网)

在这里插入图片描述

4、总结

图的邻接矩阵表示形式占用的存储单元个数只与图中的顶点个数有关,而与边的数目无关,如果一个图的边数很少,利用邻接矩阵存储就会浪费存储空间。
利用邻接表来存储图,所占用的存储单元个数不但与图中的顶点个数有关,而且与边数也有关。如果树的边数很少,用邻接表来存储占用的存储单元就少。

二、邻接表【顺序存储+链式存储(数组加链表)】

用邻接表表示图时,要对图中的每个顶点建立一个单链表,存储邻接与该顶点的所有邻接顶点及其相关信息,这个单链表就称为邻接表。
将所有顶点的邻接表表头放到数组中就构成了图的邻接表。在图的邻接表中包括两种结点结构,一个是顶点结构,另一个是边链表结构,如下图所示:

1.邻接表的数据结构

如下图所示,
在这里插入图片描述

2、无向图和有向图的示例:

在这里插入图片描述
无向图中求顶点的度:
假设求顶点D的度,只需要遍历顶点D的边链表,链表中结点的树木即为顶点的度

有向图中求顶点的度:
假设求C的出度,遍历C的边链表即可,链表中结点的树木即为顶点的度;
求C的出度,则需要遍历整个图的边链表,看哪个边是指向2(顶点C的数组下标为2)的;

3 、比较邻接表和邻接矩阵:

在这里插入图片描述

三、十字链表(适用于有向图)

1、改善 邻接表的查询结点入度 全图遍历

邻接表求出度只需遍历元素的边链表即可;
而求入度得遍历整个图;
为了改善这种情况,可以新建一个邻接表来保存入度的元素;
在这里插入图片描述
十字链表数据结构,对比邻接表,紫色部分为新增数据的结构;
firstin: 表示从别的顶点指向该顶点的边地址;
firstout: 表示从该顶点到别的顶点的边的地址;
innext:表示从别的顶点到该顶点的边的地址;
outnext:表示从该顶点到别的顶点的边的地址;
在这里插入图片描述

四、邻接多重表(适用于无向图)

1、邻接表、邻接矩阵存储无向图

在这里插入图片描述
为了解决上面的麻烦,使用邻接多重表;
其数据结构如下:
顶点结构体与邻接表一样;
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值