图的存储结构—邻接矩阵、邻接表

图的存储结构:

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

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

       那么图,是多对多的情况,另外图上的任何一个顶点都要可以被看作是第一个顶点,任一顶点的邻接点之间也不存在次序关系。

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

 

邻接矩阵(无向图):

考虑到图是由顶点和边两部分组成,合在一起比较困难,那就考虑分为两个结构来分别存储。顶点用一个结构来存放,边用一个结构来存放。

顶点因为不区分大小,主次,所以用一个一维数组来存储。而边由于是顶点与顶点之间的关系,一维数组肯定就搞不定了,所以可用一个二维数组来存储。

 

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

 

图解:

     图结构:



 

图的存储结构:

 

顶点数组

V0

V1

V2

V3

 

 

V0

V1

V2

V3

V0

0

1

1

1

V1

1

0

1

0

V2

1

1

0

1

V3

1

0

1

0

 

一维数组用于存储图结构的顶点。

此图为4个顶点,则邻接矩阵为4*4的二维数组来存储顶点之间的边(顶点之间的关系)

V0、v1、v2、v3位置表示为二维数组的下标,数组中相应位置存放0表示两顶点之间没有边,存放1则表示两顶点之间有边。

 

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

 

同理:邻接矩阵(有向图):



 

顶点数组

V0

V1

V2

V3

 

 

 

V0

V1

V2

V3

V0

0

0

0

1

V1

1

0

1

0

V2

1

1

0

0

 

可见顶点数组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,正好是第v1行的个数之和。

 

 

邻接矩阵(网):

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

 

图解:



 

 

顶点数组

V0

V1

V2

V3

 

 

V0

V1

V2

V3

V0

0

18

V1

8

0

2

V2

4

0

V3

0

 

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

0表示顶点自己不到自己,∞表示两顶点之间没有边,其余的存储两顶点之间边的权值。

 

 

 

 

 

邻接表(无向图):

虽然邻接矩阵存储图结构个很好的选择,但是对于边数相对顶点较少的图结构无疑是存在对存储空间的极大浪费。

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

 

邻接表的处理方法是:

图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易地读取顶点信息。

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

 

图解说明:



 

解释:邻接表就是用一个存储结构成员含有一个数据一个指针域的结构体的数组,数据成员data存储顶点的数据,而指针域first则指向一个单链表,这个单链表用来存储顶点与其他顶点之间的关系,如v0与v1之间有边,存储v0的数组的指针域指向的链表中存储了v1在数组中的下标位置。这样就可以用一个数组和单链表把图的结构给表示出来了,这类似于一般树的孩子存储方式。

 

邻接表(有向图)同理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值