十字链表(有向图)

对于有向图来说,邻接表(逆邻接表)是有缺陷的,其仅仅表述了关于出度(入度)的信息,如果想要了解另一方面就必须遍历整个图才可以得知。因此十字链表(Orthogonal List应运而生,可以看做是邻接表和逆邻接表的结合。

  • 顶点表结构如下:
datafirstinfirstout

        data:存放节点的相关数据信息;

        firstin:表示入边表的头指针,指向该顶点的入边表的第一个节点;

        firstout:表示出边表的头指针,指向该顶点的出边表的第一个节点;

  • 边表结构如下:
tailvexheadvexheadlinktaillink

(weight)

        tailvex:弧尾(边的起点)在顶点表中的下标;

        headvex:弧头(边的终点)在顶点表中的下标;

        headlink:指向下一个弧头(边的终点)相同的边的指针;

        taillink:指向下一个弧尾(边的起点)相同的边的指针;

        weight:可以用来存放边的权重;

有向图如右图所示:

十字链表生成步骤如下: 

  1. A->D:

                        将A的firstout指向该边节点,0和3分别表示A和D在顶点表中的下标;

                            将D的firstin指向该边节点;

  2. B->A:
                           将B的firstout指向该边节点,1和0分别表示B和A在顶点表中的下标;           
                           将A的firstin指向该边节点;
  3. B->C:
                            将上一条边B->A的taillink指向B->C,1和2分别表示B和C在顶点                                                                                               表中的下标;
                            将C的firstin指向该边节点;
  4. C->A: 
                        将C的firstout指向该边节点,2和0分别表示C和A在顶点表中的下标;
                        由于B->A与C->A的弧头(边的终点)相同且都是A,因此将边B->A                                                                                          的headlink指向边C->A;
  5. C->D:
                         将上一条边C->A的taillink指向C->D,2和3分别表示C和D在顶点表中的                                                                                   下标;
                           由于A->D与C->D的弧头(边的中点)相同且都是D,因此将边A->D的                                                                                     headlink指向边C->D;

至此,有向图的十字链表生成结束。

从每个顶点节点开始有两条链表,一条是以该节点为弧头的链表,一条是以该节点为弧尾的链表,因而容易求得顶点的入度和出度。

代码存储结构如下:

typedef struct ArcBox   // 弧的结构表示
{
    int tailvex, headvex;
    InfoType  *info;
    struct ArcBox  *hlink, *tlink;
} VexNode;
typedef struct VexNode   // 顶点的结构表示
{
    VertexType  data;
    ArcBox  *firstin, *firstout;
} VexNode;

typedef struct
{
    VexNode  xlist[MAX_VERTEX_NUM];// 顶点结点(表头向量)
    int   vexnum, arcnum;//有向图的当前顶点数和弧数
} OLGraph;

 

  • 17
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图的十字链表(Orthogonal List)是一种常用的图的存储方法,它综合了邻接表和逆邻接表的优点,可以高效地表示有向图和有向带权图。下面是图的十字链表的存储方法的结构体设计示例: ```C typedef struct ArcNode { int tailVertex; // 弧尾顶点 int headVertex; // 弧头顶点 int weight; // 弧的权重(仅在有权图中使用) struct ArcNode *tailNext; // 指向下一个同起点的弧 struct ArcNode *headNext; // 指向下一个同终点的弧 } ArcNode; typedef struct VertexNode { int vertex; // 顶点 ArcNode *firstIn; // 指向以该顶点为终点的第一条弧 ArcNode *firstOut; // 指向以该顶点为起点的第一条弧 } VertexNode; typedef struct { VertexNode vertices[MAX_VERTICES]; // 图中所有顶点的数组 int vertexCount; // 顶点数 int arcCount; // 弧数 } OrthogonalList; ``` 在这个结构体设计中,使用ArcNode来表示图中的弧,包含了弧的起点、终点、权重以及指向下一个同起点和同终点的弧的指针。VertexNode表示图中的顶点,包含了顶点的标识以及指向以该顶点为起点和终点的第一条弧的指针。OrthogonalList则是整个十字链表的结构体,包含了顶点数组、顶点数和弧数。 使用十字链表存储图的优点是可以快速地找到某个顶点的所有入边和出边,适用于需要频繁遍历图的情况。同时,十字链表还可以很方便地进行图的深度优先搜索和广度优先搜索等操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值