【CPP】模板类线性表

时间:2022-07-22
本文章向大家介绍【CPP】模板类线性表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

(先放首歌)

不知不觉便到了暑假,总得干点什么,出了看番和玩游戏,当然就是学习啦!(看我沉迷学习的眼神 *。* ),那现在来写一下最简单基本而常用数据结构:线性表。

线性表(LinearList),顾名思义,是如同一条线一般将各元素串在一起的数据结构。线性表中可能有头节点(Node)和尾结点,每个元素都有自己的前驱元素和后继元素,这种数据结构的发展空间非常大,运用c++的指针可以很方便地实现这种结构,这种结构也可变形成为其他更复杂的数据结构。

线性表常用的存储结构有两种:顺序存储和链式存储。简单理解就是:顺序存储是用数组来储存线性表,而链式存储是用链表来存储线性表。这两种各有优缺点,顺序存储的顺序表访问效率很高,占的空间(内存)少,但是插入删除数据不方便且效率低,并且空间不能随意变更,受申请的内存大小影响,一旦想加长表就要重新申请内存并复制数据。而链式存储的好处是插入删除很方便且效率较高,并且所占的空间随用随申请,不会造成浪费,但是缺点也很明显,访问的效率远低于顺序结构,且每个元素所占的内存都会比顺序结构多一点,总体上占用的内存可能会比顺序表更多。但是,由于如今电脑对速度的要求大于对空间占用的要求,链式结构可能会由于插入删除等操作的方便(顺序结构在数据多时插入数据的效率会变得很低)而更受欢迎。

说完了总起,借用大神Linus Benedict Torvalds 的名言

“废话少说,放码过来”

Talk is cheap. Show me the code.

这里上一下顺序结构的线性表的头文件:

并没有什么特别的地方,我也没怎么去写很多功能,插入数据的方法是将插入点以后的全部数据向后移动一位,然后将想要插入的数据内容赋值进空出的一位,删除数据同理,将删除点后面的全部数据向前一位从而覆盖掉想要删除的那位数据就好。

然后是比较长的链式线性表。我在上学期先OJ题的时候,常常对那些字符串和数据串的处理问题感到不爽,那些题比较繁琐,没有太大难度但是每次都要写挺长的代码,c++有提供string类给人使用但是这个类的很多功能我并用不上,每次都引入这样一个大类让我感到不爽,频繁的使用str系列函数也不是特别顺心,再者这些东西都只能给char*字符串使用,于是我便利用学习线性表编写的机会,写了一个还算能用的数据串模板类,长长的类里还有很多的不足,但是还算对做题有点用(干别的我就不指望了)。

上一下头文件:

在这里面,节点利用C自身的结构体来写,包含一个data和一个向后继的指针(p_next),所以这只是一个单向链表(因为双向的感觉没有必要),这个表的排序时会频繁用到p_nows指针来加快访问,重载了一些运算符来让这个类用起来更顺手,通过双边的pop这两种不同的操作可以模拟队列和栈这两种数据结构,用cut函数和search函数来切出自己想要的部分,并可以把线性表再次以数组的方式返回,这里贴一下最关键的uptodownsort函数的实现(可能看不太清晰):

大概就是这样,通过保留一个p_nows指针的位置来小幅度加快搜索的速度,在排序前先清空自己来给内存腾出空间,至于另一个比较关键的函数search则是用很普遍的遍历方法来搜索,关于重载[]运输符中得到数组下标也是用遍历的方法,这就是开头说的访问低效率的原因了,因为整条链表中的元素只有头和尾我们可以知道它的位置,其他的每个节点的位置和内容都需要靠他们的前驱元素的后继指针来获得。

结尾给一下全部代码:http://pan.baidu.com/s/1kUO2HJD

啊,多么热的夏天呀,真是无聊。