图的存储结构之十字链表

数据结构的教材是严蔚敏的,以下是书上的代码摘抄,仅有代码解释,没有图示。

//-----有向图的十字链表存储表示的形式说明-----
#define MAX_VERTEX_NUM 20
typedef struct ArcBox {                 // 弧结点的定义
    int             tailvex, headvex ;           //该弧的尾和头顶点的位置
    struct ArcBox * hlink, * tlink ;    //分别为弧头相同和弧尾相同的弧的链域
} ArcBox ;

typedef struct VexNode {                // 顶点结点的定义
	VertexType data  ;                  // 顶点内容
	ArcBox * firstin, * firstout ;      // 分别指向该顶点的第一条入弧和出弧
} VexNode ;
 
typedef struct OLGraph {                // 十字链表存储结构的有向图定义
	VexNode xlist[MAX_VERTEX_NUM] ;     //表头向量
	int vexnum,arcnum  ;               //有向图(已创建好的图)的顶点数和弧数
} OLGraph ;


Status CreateDG( OLGraph &G) {
    //采用十字链表存储表示,构造有向图G(G.kind=DG)。
    scanf( &G.vexnum,&G.arcnum, &IncInfo );		        //IncInfo为0则各弧不含其他信息
    for ( i=0 ; i<G.vexnum ; ++i ) {					        //构造表头向量
        scanf( &G.xlist[i].data );						        //输入顶点值
        G.xlist[i].firstin = NULL, G.xlist[j].firstout = NULL;  //初始化指针
    }
    for ( k=0 ; k<G.arcnum ; ++k ) {				        //输入各弧并构造十字链表
        scanf(&vl,&v2);						            //输入一条孤的始点和终点
        i = LocateVex( G, v1 ); j=LocateVex( G , v2 );//确定v1和v2在G中位置
        p = ( ArcBox * ) malloc (sizeof (ArcBox));//假定有足够空间
        *p = {i , j, G.xlist[j].firstin , G.xlist[i].firstout , NULL}    //对弧结点赋值
            //{tailvex,headvex,hlink,tlink,info}
        G.xlist[j].firstin = G.xlist[i].firstout = p;        //完成在入弧和出弧链头的插人
        if(IncInfo) Input( *p->info);                        //若弧含有相关信息则输入
    }
}//CreateDG

其中scanf语句和*p的赋值语句为伪代码;

书中没有说明怎么实现的(我比较看的不仔细),所以自己总结了一下,其实和单链表的插入差不多。

首先是头插入,新输入弧结点在顶点结点的方。

:新插入弧为:V1→V2,所以V1是弧尾V2是弧头

① 全部的顶点的firstin,与firstout,先置空(单链表尾结点置空一个道理)。

② 建立弧结点p,并赋值。

③ 将p插入中,

要把 V2->firstin 给 p->hlink(头对头), V1->firstout 给 p->tlink(尾对尾),

(相当于p继承了V1,V2的 "next" 指针)

然后把 p 的地址给 V2->firstin 和 V1->firstout 。

(相当于p变成了V1,V2的"next"指针)

其他都能自行看懂了,不理解现在的东西简单的东西拼命解释,循环,需要想的就不解释了(也有可能是我书看的不仔细)也不是说叫别人不要思考,只是我思维能力比较差,只能通过数据代入(模拟计算机流程),才能明白为什么这样做,个人看法,仅供参考,写出来也是主要为了便于以后查看理解。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值