十字链表及其C++实现

本文介绍了十字链表的概念,作为解决邻接矩阵在稀疏图中效率低下的问题而提出的解决方案。通过将邻接矩阵转换为十字链表结构,文章详细解释了十字链表如何存储和查找边,并提供了C++实现的节点类和边类的代码示例。
摘要由CSDN通过智能技术生成

前言

最近有个同学在用十字链表做毕设,然后我手痒了就拿过来把他毕设拿过来代码翻掉重写。一方面以前也没怎么写过十字链表,另一方面好久不写数据结构了随便找个来练练手。至于他毕设的其他内容嘛应他本人要求结题前就不发了。

正文

一. 十字链表的理解

图大概一共有4中存储方式:邻接矩阵,邻接表,边集数组,十字链表。

其实前三种数据结构都十分得好理解,尤其是邻接矩阵。大概所有人都是从这个数据结构开始入门图论的。他也确实非常得好理解,一个二维矩阵的第i行第j列表示是否存在一条边从i到j,当然也可以表示i到j这条边的权重。

这里我们就稍微简单一点处理,0表示两节点不相连,1表示相互连接。

比如下面左边的邻接矩阵可以对应成右边这张图。


邻接矩阵无疑是非常简单的,但是其缺点也暴露的非常明显——当是一个稀疏图时(节点多,连边少),寻找一个点能连到的所有点代价非常大,需要把矩阵整个一行都遍历一遍。此外,邻接矩阵的存储需要空间也恒定为点数量的平方,对于稀疏图而言,矩阵中会存在大量0表示两个点之间没有连线,这样会存在非常大的空间浪费。

为了解决这个问题,诞生了邻接表和边集数组。

邻接表和边集数组当然稀疏图上相比邻接矩阵是有明显优势的,从一个特定节点出发去寻找其他节点时不需要把所有点都看个遍了,但是邻接表和边集数组终究还是在一些特殊问题上遇到些麻烦——不能沿着边反着找。就比如上图,如果我需要寻找所有能连接到2的节点,就需要把0,1,3给找个遍了。并且由于邻接表和边集数组的存储方式,可能找这样的点得把整个图都遍历一次。


基于种种奇怪的需求,一种更健壮的数据结构产生了——十字链表。

我们这里演示一下如何从邻接矩阵的角度去看十字链表

我们首先把原来的邻接矩阵给拆了,只保留有连线的部分


当然这种形状电脑是绝对

  • 23
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值