十字链表(有向图)

对于有向图来说,邻接表(逆邻接表)是有缺陷的,其仅仅表述了关于出度(入度)的信息,如果想要了解另一方面就必须遍历整个图才可以得知。因此十字链表(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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值