现在的位置: 首页 > 综合 > 正文

图的存储结构—十字链表

2018年03月21日 ⁄ 综合 ⁄ 共 841字 ⁄ 字号 评论关闭

图的存储结构:

 

邻接表虽然很好,但也有不足,列如对有向图的处理上,有时候需要在建立一个逆邻接表。

默认的邻接表是关注的顶点的出度和弧尾的,如果我们要关注有向图顶点的入度和弧头,我们就需要在建立个逆邻接表了。

 

所以,有没有可能把邻接表和逆邻接表结合起来呢?

 

十字链表:

 

为此我们要重新定义顶点表节点结构:

         Data

         firstIn

         firstOut

 

firstIn:表示第一个入边表的指针

firstOut:表示第一个出边表的指针

 

然后重新定义边表节点结构:

   tailVex

    headVex

  headLink

    tailLink

 

tailVex:表示弧起点的顶点下标

headVex:表示弧终点的顶点下标

则此边表表示的一条弧(与邻接表的表示一个顶点所不同)

这样不添加fistIn入度的信息就和邻接表是相似的了。(只是边表表示的一个弧而不是一个顶点)。

给上面的图解添加入度的信息(firstIn)

 

V0顶点的入度为v1->v0,则v0的firstIn的指针域指向v1->v0这条弧,v0顶点的第二个入度为v2->v0,则表示v1->v0这条弧的链表的headLink指针域指向v0的下个入度v2->v0弧,

因为v0顶点除此之外在没有入度了,则表示v2->v0弧的链表的入度指针域为空指针。

 

V1顶点的入度为v2->v1,则v1的firstIn指针指向v2->v1这条弧,由于v1顶点只有一条入度弧,则v2->v1弧的链表的headLink指针域为空。

 

同理v2的入度为v1-v2,则指向v1-v2弧的链表

 

总结:

 

顶点数组:数组元素为一个结构体,数据元素,两个指针域,firstOut指向出度链表

firstIn指向入度。

边表(表示一个弧):为一个单链表,元素为一个4个元素的结构体,tailVex为该弧的起始顶点,headVex为该弧的终点顶点。

tailLink指针域:指向该顶点的下一个出度。

headLink指针域:指向该顶点的下个入度。

 

抱歉!评论已关闭.