基础知识
链表是一种线性表数据结构,其和顺序表的最大区别是链表在内存中无需连续存储,因此链表节点需要增加指针域(对于无指针的编程语言可能需要通过游标实现)用来指向下一个元素的内存地址。单向链表是链表的一种,其特点是链表的链接方向是单向的,访问单向链表的全部元素必须从头部开始依次访问。在单向链表的实现中,为了便于对表头元素进行插入、删除等操作,一般定义一个表头(header)或者称为哑节点(dummy node),且默认表头在位置0处。在单向链表ADT中,一般至少需要需要实现以下操作:
- 清空整个链表:MakeEmpty
- 查找某个元素:FindElement
- 删除一个元素:DeleteElement
- 插入一个元素:InsertElement
在C++标准模板库(STL)中,list实现了一种双向链表。
单向链表数据结构的定义
仿照《数据结构与算法分析-C语言描述》一书中定义的格式,不过采用C++模板的编写方式尝试编写单向链表的操作。
1 | template <typename DataType> |
如上所示,在链表类中有三个数据成员,分别为dummyNode、listSize和lastNode。dummyNode是哑节点,不动态创建;listSize保存当前链表大小,对一些函数可快速判断输入是否合法;lastNode保存最后一个节点的地址。
下面依次实现各函数:
- 清空链表
1 | template <typename DataType> |
- 判断列表是否为空
1 | template <typename DataType> |
- 判断是否为最后一个元素
1 | template <typename DataType> |
- 查找一个元素并返回地址
1 | template <typename DataType> |
- 查找第n个元素,dummy为第0个元素,返回地址或者nullptr
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 |
|