图的存储结构之十字链表、邻接多重表、边集数组

十字链表 (Orthogonal List) 

对于有向图来说,邻接表是有缺陆的。关心了出度问题,想了解入度就必须要遍历整个图才能知道。反之,逆邻接表解决了入度却不了解出度的情况。

顶点表结构:

  

其中 firstin 表示入边表头指针,指向该顶点的入边表中第一个结点, ftrstout 表示出边表头指针,指向该顶点的出边表中的第一个结点。

边表结点结构:

  

其中 tailvex 是指弧起点在顶点表的下标, headvex 是指弧终点在顶点表中的下标, headlink 是指入边表指针域,指向终点相同的下条边, 饭taillink

指边表指针域,指向起点相同的下条边。如果是网,还可以再增加一个 weight 域来存储权值。 

       

顶点依然是存入一个一维数组,以顶点 Vo 来说,firstout 指向的是出边表的第个结点V3。所以 Vo 边表结点的 headvex=3 ,而 tailvex 其实就是当前顶

点V0下标0 ,由于 Vo 只有一个边顶点,所以 headlink taillink 都是空。 

虚线箭头其实就是此图的逆邻接表的表示。对于Vo 来说,它有两个顶点V1和V2的入边。因此 Vo 的 firstin 指向顶点 V1 的边表结点中headvex 为 0 的结点,

如图中的①。接着由入边结点的 headlink 指向下一个入边顶点V2,如图中的②。对于顶点 V1,它有一个入边顶点V2,所以它的firstin指向顶点 V2 的边表

结点中 headvex 为 1 的结点,如图中的③。顶点 V2 和 V3 也是同样有一个入边顶点,如图中④和⑤。

十字链表的好处就是因为把邻接表和逆邻接表整合在了一起,这样既容易找到以Vi为尾的弧,也容易找到以Vi为头的弧,因而容易求得顶点的出度和入度。

创建图算法的时间复杂度是和邻接表相同的。

邻接多重表

                              

ivex和jvex是与某条边依附的两个顶点在顶点表中的下标。ilink指向依附顶点ivex的下一条边,jlink指向依附顶点jvex的下一条边。

                           

首先连线的①②③④就是将顶点的firstedge指向一条边,顶点下标要与ivex的值相同。接着,由于顶点Vo 的(V0,V1)边的邻边

(V0,V3)(V0,V2) 。因此⑤⑥的连线就是满足指向下条依附于顶点V0的边的目标,注意ilink指向的结点的 jvex 一定要和它本身

ivex 的值相同。同样的道理,连线就是指 (V1V0) 这条边,它是相当于顶点 V1 指向 (V1V2) 边后的下一条。V2 有三条边

依附,所以在之后就有了⑧⑨ 。连线的就是顶点V3 在连线之后的下一条边。坐图一共有5条边,所以右图有10条连线。

边集数组

边集数组是由两个一维数组构成。一个是存储顶点的信息;另一个是存储边的信息,这个边数组每个数据元素由一条边的起点下标 (begin) 、

终点下标 (end) 和权(weight) 组成。适合对边依次进行处理的操作。

                         

(参考《大话数据结构》)

猜你喜欢

转载自www.cnblogs.com/wuyt/p/9551686.html