1.Listnode(节点)
节点相当于是装数据的车厢,因此也要进行一定的封装
其中的成员变量包括T类型的数据,以及两个指向节点类的指针。(这有个很有意思的现象,定义的过程中用到了指向自身的指针,到底是先有鸡还是现有蛋)
操作接口有两个,前插入和后插入
2.List(列表类)
成员变量有三个,一个是和向量类似的size,还有两个分别是头哨兵和尾哨兵(节点类指针)。列表是寻地址访问,向量是寻秩访问(秩是逻辑上的顺序),列表也可以寻秩访问(重载【】,但是效率很低,所以虽然可以把列表当向量用,但是别用,考虑到效率,向量肯定更快)像查找、插入这类的操作,向量返回的是不大于的最大的秩,而列表返回的是位置。其实给定一个节点类的指针,那么它对应一个列表。
3.查找
有序列表无法适用二分查找等向量使用的方法,因为无法在常数时间内寻秩访问
4.排序
选择排序:可以看作冒泡排序的改进版,移动的次数减少,O(n^2)主要来源于比较。但是输入不敏感,冒泡排序改进版最好情况O(1).
同时可以改进为堆排序,选取最大值的函数可以用堆来代替,每次只要logn,综合下来nlogn。
循环节:如果选择最大的和最后一个交换,那么有多少个循环节就有多少个无效交换。
插入排序:
输入敏感,和逆序对数目相关
归并排序:
输入的是起点加长度,输出的排序完后的列表由输入的那个起点表示。(用来统计逆序对数目?)
5.游标实现
其实就是定义两个数组(),一个存放数据,一个存放地址,其中地址用数组的秩来表示。同时用两个变量来维护插入、删除等操作。free表示的是空余空间链表的首个地址,data白哦是的是后插入的节点的末地址(列表方向向前),当插入一个元素时,首先访问free,可以得到插入的地址在哪(free转向下一个值,即link表中的值),在相应位elem中计入数据,同时在link中填入上一个data值,同时更新data值为当前地址。删除操作将free值变成删除元素地址,同时link值变为之前的free值,同时将指向该元素的元素的link值变为删除元素的link值。(其实要实现列表,要满足二点,一是可以找出存放数据(包括地址)的空间,二是地址可以标识,用两个数组和两个标识变量就可以实现)
6.序列sequence
向量和列表是序列的不同实现。