基础知识
单向链表的游标实现和指针实现最大的不同是游标实现无法采用指针的方式连接到下一个节点,其只能通过数组下标的方式进行下一节点的索引,因此游标实现相比指针实现需要手动管理数组内存使用情况,本文直接采用《数据结构与算法分析:C语言描述》中的思路,不过本文使用了一个哑节点,代码中约定数组第0号节点用来模拟管理内存,1号节点作为哑节点,具体的定义和实现如下小节所示。
游标单向链表的定义和实现
由于游标实现中不能动态申请内存,因此函数中会预先分配一个固定大小的数组。具体实现见如下代码:
1 | template <typename DataType> |
如上所示,在链表类中有四个数据成员和一个全局变量maxListSize,数据成员分别为dummyNode、listNodes、listSize和lastNode。maxListSize是指节点数组最大容量,listNodes是节点数组,listSize是当前链表大小,dummyNode是哑节点索引,lastNode保存最后一个节点的数组索引。
下面依次实现各函数:
- 构造函数,0号节点作为内存管理头节点,1作为哑节点(因为0代表没有下一个节点)
1 | template <typename DataType> |
- 析构函数,模拟内存回收
1 | template <typename DataType> |
- 清空链表
1 | template <typename DataType> |
- 判断列表是否为空
1 | template <typename DataType> |
- 判断是否为最后一个元素
1 | template <typename DataType> |
- 查找一个元素并返回下标
1 | template <typename DataType> |
- 查找第n个元素,dummy为第0个元素,返回地址或者0
1 | template <typename DataType> |
- 删除一个节点,如果不存在则不做任何事
1 | template <typename DataType> |
- 删除第n个节点,如果不存在则不做任何事
1 | template <typename DataType> |
- 插入一个节点, n<0或者>链表长度代表直接插到末尾,其他代表插到第n个节点后
1 | template <typename DataType> |
- 申请一个单位空间函数
1 | template <typename DataType> |
- 释放一个单位空间函数
1 | template <typename DataType> |
- 返回链表长度
1 | template <typename DataType> |
- 打印链表
1 | template <typename DataType> |
代码测试
对上述代码进行简单地测试,测试代码如下:
1 |
|