图的存储结构

图的存储结构相比较线性表与树来说就复杂很多。
对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放。树结构是一对多的关系,所以我们要将数组和链表的特性结合在一起才能更好的存放。
图,是多对多的情况,另外图上的任何一个顶点都可以被看作是第一个顶点,任一顶点的邻接点之间也不存在次序关系。

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

邻接矩阵(无向图)

无向图邻接矩阵的特性
邻接矩阵是对称方阵;
对于顶点vi,其度数是第i行的非0元素的个数;
无向图的边数是上(或下)三角形矩阵中非0元素个数。
无向图的邻接矩阵中非零元个数 = 2*无向图边数
有了这个二维数组组成的对称矩阵,我们就可以很容易地知道图中的信息:
要判定任意两顶点是否有边无边就非常容易了;
要知道某个顶点的度,其实就是这个顶点Vi在邻接矩阵中第i行(或第i列)的元素之和;

邻接矩阵(有向图)

对有向图可以建立正邻接表或逆邻接表。正邻接表是以顶点Vi为出度(即为弧的起点)而建立的邻接表;逆邻接表是以顶点Vi为入度(即为弧的终点)而建立的邻接表;
◆ 在有向图中,第i个链表中的结点数是顶点Vi的出 (或入)度;求入 (或出)度,须遍历整个邻接表

邻接矩阵(网)

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

十字链表法
十字链表(Orthogonal List)是有向图的另一种链式存储结构,是将有向图的正邻接表和逆邻接表结合起来得到的一种链表。
在这种结构中,每条弧的弧头结点和弧尾结点都存放在链表中,并将分别组织到以弧尾结点为头(顶点)结点和以弧头结点为头(顶点)结点的链表中。

邻接多重表(Adjacency Multilist)
邻接多重表(Adjacency Multilist)是无向图的另一种链式存储结构。
在无向图的邻接表中,一条边(v,w)的两个表结点分别被选在以v和w为头结点的链表中。如果关注的重点是顶点,则邻接表是不错的选择,但在涉及到边的操作会带来不便。
邻接多重表的结构和十字链表类似,每条边用一个结点表示;邻接多重表中的顶点结点与邻接表中的完全相同
Data域:存储和顶点相关的信息;
firstedge:指向依附于该顶点的第一条边所对应的表结点;
mark:用以标识该条边是否被访问过;
ivex和jvex:分别保存该边所依附的两个顶点在顶点表中的下标;
info域:保存该边的相关信息;
ilink:指向依附于顶点ivex的下一条边;
jlink:指向依附于顶点jvex的下一条边;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章