数据结构学习笔记之线性表

一、概念

什么是线性表呢? 一个简单的理解如下:

线性表是由称为元素(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

猜你喜欢

转载自www.cnblogs.com/wsmrzx/p/9824569.html