考研数据结构 第6章图|图的存储结构3.十字链表4.邻接多重表

1,245 阅读5分钟

这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战

图的存储结构

3.十字链表

十字链表是有向图的一种链式存储结构,在十字链表中对应于有向图的每条弧有一个结点,对应于每个顶点也有一个结点。结点结构如下:

image.png 弧结点5个域:
弧尾位置、弧头位置、弧头相同的下一条弧、弧尾相同的下一条弧和该弧的信息

顶点结点3个域:
顶点的数据域、以该顶点为弧头的第一个弧结点、以该顶点为弧尾的 第一个弧结点

image.png

有向图的十字链表存储结构的定义

#define  MaxVertexNum  100          //图中顶点数目的最大值 
typedef  struct  ArcNode{                 //边表结点
int  tailvex,headvex;
struct  ArcNode  *hlink,*tlink; 
//InfoType  info
}ArcNode;
typedef  struct  VNode{                   //顶点表结点
VertexType  data;
ArcNode  *firstin,*firstout;
}VNode;
typedef  struct{
VNode  xlist[MaxVertexNum];   //邻接表
int  vexnum,arcnum;                    //图的顶点数和弧数
}GLGraph;

4.邻接多重表

邻接多重表是无向图的一种链式存储结构,在邻接多重表中对应于无向 图的每条边有一个结点,对应于每个顶点也有一个结点。结点结构如下:

image.png 边结点5个域:
ivex和jvex为该边依附的两个顶点在图中的位置,ilink指向下一条依附于顶点ivex的边,jlink指向下一条依附于顶点jvex的边,info存储必要的信息

顶点结点2个域:
data表顶点的数据域、firstedge指示第一条依附于该顶点的边

image.png

无向图的邻接多重表存储结构定义

#define  MaxVertexNum  100         //图中顶点数目的最大值 typedef  struct  ArcNode{                //边表结点
int  ivex,jvex;
struct  ArcNode  *ilink,*jlink; 
//InfoType  info;
}ArcNode;
typedef  struct  VNode{                    //顶点表结点
VertexType  data; 
ArcNode  *firstedge;
}VNode;
typedef  struct{
VNode  adjmulist[MaxVertexNum];    //邻接表
int  vexnum,arcnum;                              //图的顶点数与边数
}AMLGraph;

扩展材料

7.2.3 十字链表

十字链表是有向图的另一种链式存储结构,可以看成是邻接表与逆邻接表的结合,即有向图中的每一条弧对应十字链表中的一个弧节点,每个顶点在十字链表中对应顶点节点。这两类节点结构如图7-12所示。

img

图7-12 十字链表弧节点、顶点节点结构图

在弧节点中有5个域:其中尾域(tailvex)和头域(headvex)分别指示弧尾和弧头这两个顶点在图中的位置,链域hnext指向弧头相同的下一条弧,链域tnext指向弧尾相同的下一条弧,info域指向该弧的相关信息。弧头相同的弧在同一链表上,弧尾相同的弧也在同一链表上。它们的头节点即为顶点节点,它由3个域组成:data域存储和顶点相关的信息,如顶点名等;firstin和firstout为两个链域,分别指向以该顶点为弧头或弧尾的第一个弧节点。在十字链表中,弧节点所在的链表非循环链表,节点之间相对位置自然形成,不一定按顶点序号排序;表头节点即顶点节点,才是顺序存储。

若有向图是稀疏图,则其邻接矩阵一定是稀疏矩阵,则十字链表也可以看成是邻接矩阵的链表存储结构。有向图的十字链表如图7-13所示。

img

图7-13 有向图的十字链表示意图

有向图的十字链表结构的形式描述如下。

img

在十字链表中既容易找到以vi为尾的弧,也容易找到以vi为头的弧,因而容易求得顶点的出度和入度。在某些有向图的应用中,十字链表是很有用的工具。

7.2.4 邻接多重表

邻接多重表是无向图的另一种存储结构。因为,如果用邻接表存储无向图,每条边的两个边节点分别在以该边所依附的两个顶点为头节点的链表中,这给图的某些操作带来不便。比如对已访问过的边做标记,或者要删除图中某一条边,都需要找到表示同一条边的两个节点。因此,在进行这一类操作的无向图的问题中,采用邻接多重表作为存储结构更为适宜。

邻接多重表的存储结构和十字链表类似,也是由顶点表和边表组成的,每一条边用一个节点表示,其顶点表节点结构和边表节点结构如图7-14所示。

img

图7-14 邻接多重表的节点结构

其中,顶点表由两个域组成,data域存储与该顶点相关的信息,firstedge域指示第一条依附于该顶点的边。边表节点由6个域组成:mark为标记域,可用以标记该条边是否被搜索过;ivex和jvex为该边依附的两个顶点在图中的位置;inext指向下一条依附于顶点ivex的边;jnext指向下一条依附于顶点jvex的边;info为指向与边相关的各种信息的指针域。

无向图的邻接多重表如图7-15所示。

img

图7-15 无向图的邻接多重表示意图

邻接多重表中所有依附于同一顶点的边串联在同一链表中,由于每条边依附于两个顶点,则每个边节点同时链接在两个链表中。可见,对无向图而言,其邻接多重表和邻接表的差别,仅仅在于同一条边在邻接表中用两个节点表示,而在邻接多重表中只用一个节点。

因此,除了在边节点中增加一个标志域外,邻接多重表所需的存储大小和邻接表相同。在邻接多重表上,各种基本操作的实现亦和邻接表相似。邻接多重表结构的形式描述如下。

img