【数据结构学习记录19】——图的储存结构

一.邻接矩阵

邻接矩阵很简单,假设我们有n个变量,那么我们就创建一个n*n的矩阵G。假设弧是为<i,j>那么我们可以通过矩阵G[i][j]的值来判断这个弧是否存在。比如不存在的弧,我们规定为值为0,存在的弧则为1,若有权,则为它的权。
例如下图所示的图,用邻接矩阵表示则为:
在这里插入图片描述

∣ 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 ∣ \begin{vmatrix} 0 & 1 &0 &0 \\ 1&0 &1 &1 \\ 0&0 &0 &0 \\ 0&0 &0 &0 \end{vmatrix} 0100100001000100
我们可以把这个图看作为:

在这里插入图片描述
这样就好理解了。
如果是无向图的话,我们只用一个对角矩阵即可。

二.邻接表

1.邻接表

假设我们为结点创建一个数据类型,然后该结点指向的弧也是一个数据类型,分别叫表结点头结点,那么我们可以这样表示:其中info可要可不要,用于保存其他信息,比如弧的权。
在这里插入图片描述

假设为了实现这个图:
在这里插入图片描述
我们先顺序创建顶点结点,括号内的值,是我们结点的顺序储存的下标。
在这里插入图片描述
添加A的所有弧:
在这里插入图片描述
添加B的所有弧:
在这里插入图片描述
同理,最后完成则为:
在这里插入图片描述
邻接表非常容易找到任意顶点的第一个邻接点和下一个领接点。但是如果要判定是否有边或弧相连,尤其是边,那是非常麻烦的。

2.逆邻接表

在学十字链表储存法之前,了解一下概念,有助于理解十字链表。
还是这个图,还是这种储存方式,只不过把弧给换个方向,比如上图的逆邻接表则为:
在这里插入图片描述

三.十字链表

简单来说,十字链表就是将邻接表和逆邻接表合二为一了。一般用于有向图。
它的储存结构是:
在这里插入图片描述

tailvex:弧尾
headvex:弧头
hlink:弧头相同的下一条弧
tlink:弧尾相同的下一条弧
info:还是该弧的信息

我们依旧还是先顺序创建顶点:
在这里插入图片描述
然后再根据弧尾为每个顶点创建弧:
在这里插入图片描述
然后我们把0、1、2、3的tlink指向值相同的tailvexhlink指向值相同的的headvex。比如:
在这里插入图片描述
这样就构建了一个表。可能我这个图不怎么好看,看其他的版本:
在这里插入图片描述

四.邻接多重表

我们采用这种方式储存结点边和顶点。mark用于遍历时,确定是否遍历过,标记变量。
ivexjvex是当前边的顶点值,ilink指向相同ivex的边,jlink指向相同jvex的边。
在这里插入图片描述
我们看看这个图:
在这里插入图片描述

还是依旧顺序创建顶点结点:
在这里插入图片描述

然后依旧根据ivex创建每条边:
在这里插入图片描述
ilink指向相同ivex的边,jlink指向相同jvex的边:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u011017694/article/details/110452789