一、概念
什么是线性表呢? 一个简单的理解如下:
线性表是由称为元素(Element)的数据项组成的一种有限且有序的序列
其中,这里有一个需要注意的地方:
- 有序是指线性表中的每个元素都有自己的位置,而不是指线性表中的元素按某种顺序排列
二、抽象数据类型定义
要给数据结构定义一种恰当的表示方法,我们首先要考虑到这种表示法要支持的基本操作,以及完成对应操作所需的时空复杂度等因素,那么对于线性表来说有哪些常见的操作呢?
- 初始化和重新初始化一个线性表
- 在长度上可以伸长和缩短
- 可以在线性表上任何位置插入和删除元素
- 获取或者更改元素的值
下面我们依据线性表的基本操作,使用 C++ 来定义线性表的抽象数据类型(ADT),该 ADT 中包含的关键设计是对当前位置的操作支持,我们来看看具体每一个函数所完成的工作吧
class List
public
List() {}
// 默认构造函数virtual ~List() {}
// 析构函数List(const List&) {}
// 复制构造函数void operator =(const List&) {}
// 重载赋值运算符virtual void clear() = 0;
// 清空线性表virtual void insert(const E& item) = 0;
// 在当前位置插入一个元素virtual void append(const E& item) = 0;
// 在表尾追加一个元素virtual E remove() = 0;
// 删除当前位置的一个元素virtual void moveToStart() = 0;
// 将当前位置移动到表头(表头是指线性表的开始节点)virtual void moveToEnd() = 0;
// 将当前位置移动到表尾(表尾是指线性表的结尾节点)virtual void moveToPos(int pos) = 0;
// 将当前位置移动到指定位置virtual void prev() = 0;
// 将当前位置前移一个位置virtual void next() = 0;
// 将当前位置后移一个位置virtual int length() const = 0;
// 返回线性表的长度(线性表的长度指当前线性表储存的元素数目)virtual int currPos() const = 0;
// 返回当前位置virtual const E& getValue() const = 0;
// 返回当前位置的元素的值
完整代码(包含详细注释)请看:https://github.com/Forwhfang/Data-Structure/blob/master/list.h
三、顺序表
线性表的实现有两种标准的方法,一种是顺序表(Sequential List),另一种是链表(Linked List),这里我们先讲解顺序表的实现,整体的代码框架以及实现分析如下:
class slist : public list (Sequential List 基于数组实现)
私有数据成员:
- int maxSize // 顺序表的容量
- int listSize // 顺序表的长度
- int curr // 当前元素位置,顺序表中没有元素存在时 -> -1,顺序表中有元素存在时 -> [0, size-1]
- E* listArray[] // 顺序表元素指针,用于操作每一个元素
公有成员函数:
SList(int _size = DEFAULT_SIZE)
// 默认构造函数SList(const SList& obj)
// 复制构造函数void operator =(const SList& obj)
// 重载赋值运算符~SList() {}
// 析构函数void clear()
// 清空线性表 //void insert(const E& item)
// 在当前位置插入一个元素,当在线性表中随机插入一个元素时,插入位置后的所有元素必须向后移动一个位置以腾出空间,如果线性表中有 n 个元素,则这个过程需要花费 Θ(n) 时间void append(const E& item)
// 在表尾追加一个元素item 在末尾插入一个元素,需要花费的时间为 Θ(1)E remove()
// 删除当前位置的一个元素,和插入元素的原理类似,当在线性表中随机删除一个元素时,删除位置后的所有元素必须向前移动一个位置以填满空间,如果线性表中有 n 个元素,则这个过程需要花费 Θ(n) 时间void moveToStart()
// 将当前位置移动到表头,将 curr 移动到表头元素位置,时间复杂度为 Θ(1)void moveToEnd()
// 将当前位置移动到表尾,将 curr 移动到表尾元素位置,时间复杂度为 Θ(1)void moveToPos(int pos)
// 将当前位置移动到指定位置,将 curr 移动到指定元素位置,时间复杂度为 Θ(1)void prev()
// 将当前位置前移一个位置,将 curr 减一,时间复杂度为 Θ(1)void next()
// 将当前位置后移一个位置,将 curr 加,时间复杂度为 Θ(1)int length() const
// 返回线性表的长度,返回 size 的值,时间复杂度为 Θ(1)int currPos() const
// 返回当前位置,返回 curr 的值,时间复杂度为 Θ(1)const E& getValue() const
// 返回当前位置的元素的值,返回 listarray[curr] 的值,时间复杂度为 Θ(1)
完整代码(包含详细注释)请看:https://github.com/Forwhfang/Data-Structure/blob/master/slist.h