前言
最近有个同学在用十字链表做毕设,然后我手痒了就拿过来把他毕设拿过来代码翻掉重写。一方面以前也没怎么写过十字链表,另一方面好久不写数据结构了随便找个来练练手。至于他毕设的其他内容嘛应他本人要求结题前就不发了。
正文
一. 十字链表的理解
图大概一共有4中存储方式:邻接矩阵,邻接表,边集数组,十字链表。
其实前三种数据结构都十分得好理解,尤其是邻接矩阵。大概所有人都是从这个数据结构开始入门图论的。他也确实非常得好理解,一个二维矩阵的第i行第j列表示是否存在一条边从i到j,当然也可以表示i到j这条边的权重。
这里我们就稍微简单一点处理,0表示两节点不相连,1表示相互连接。
比如下面左边的邻接矩阵可以对应成右边这张图。
邻接矩阵无疑是非常简单的,但是其缺点也暴露的非常明显——当是一个稀疏图时(节点多,连边少),寻找一个点能连到的所有点代价非常大,需要把矩阵整个一行都遍历一遍。此外,邻接矩阵的存储需要空间也恒定为点数量的平方,对于稀疏图而言,矩阵中会存在大量0表示两个点之间没有连线,这样会存在非常大的空间浪费。
为了解决这个问题,诞生了邻接表和边集数组。
邻接表和边集数组当然稀疏图上相比邻接矩阵是有明显优势的,从一个特定节点出发去寻找其他节点时不需要把所有点都看个遍了,但是邻接表和边集数组终究还是在一些特殊问题上遇到些麻烦——不能沿着边反着找。就比如上图,如果我需要寻找所有能连接到2的节点,就需要把0,1,3给找个遍了。并且由于邻接表和边集数组的存储方式,可能找这样的点得把整个图都遍历一次。
基于种种奇怪的需求,一种更健壮的数据结构产生了——十字链表。
我们这里演示一下如何从邻接矩阵的角度去看十字链表
我们首先把原来的邻接矩阵给拆了,只保留有连线的部分
当然这种形状电脑是绝对