本章概览
- 线性表的逻辑结构
- 线性表的顺序存储及实现
- 线性表的链接存储及实现
- 顺序表和链表的应用
- 线性表的其他存储方法
线性表的概念
线性表(linear line)是最简单的数据结构。非空表记为:L=(a1, a2 , …, ai-1, ai , …, an)。
其是一个有限序列,表中每个表项都是相继排列的,每两个相邻表象都有直接前驱和直接后继关系,也就是说,线性表中仅存在唯一的一个表头(haed)、唯一的一个表尾(tail)。
线性表的特性
- 有限性:线性表中数据元素的个数是有穷的。
- 相同性:本章线性表中数据元素的类型是同一的。
- 顺序性:线性表中相邻的数据元素ai-1和ai之间存在序偶关系(ai-1, ai),即ai-1是ai的前驱, ai是ai-1的后继;a1无前驱,an无后继,其它每个元素有且仅有一个前驱和一个后继。
线性表的功能概述
ADT LinearList {
数据对象:
D={ ai | ai∈ T, i=1,2,...,n, n≥0 }
数据关系:
R1={ <ai-1, ai >| ai-1, ai ∈D, i=2,...,n }
基本操作:
enum bool{false,true}; //枚举类型
template <class T>
class LinearList{
//线性表的具体定义与实现采用继承与派生方式。此为基类定义,体线性表的实现要根据其派生类的具体定义而实现
public:
LinearList(); //初始化
~LinearList(); // 销毁
virtual int Size()const=0; //注意均为纯虚类定义
virtual int Length() const=0;
virtual int Search(T& x)const=0;
virtual Locate(int i)const=0;
virtual bool IsEmpty()const=0;
virtual bool IsFull()const=0;
virtual bool getData(int i,T& x)=0;
virtual bool Insert(int i,T& x)=0;
virtual bool Remove(int i, T& x)=0;
virtual void Sort()=0;
virtual void input()=0;
virtual void output()=0;
virtual LinearList<T> operator=(LinearList<T>& L)=0; //运算符重载
};
纯虚函数在构造线性表中的意义
我们用派生和继承的方式来实现线性表的具体定义和操作,以实现多态性。
所谓多态性指不同对象接收到不同消息时,根据对象类的不同而产生不同的动作,即对应同一个函数名的函数执行不同的函数体。其提高了代码的重用性和运行效率,更重要的是提高了软件的可扩充性。
纯虚函数其实就是声明一个虚函数,再在基类中定义它,基类中的纯虚函数只有函数名而不具备函数的功能,不能被调用。而在派生类中只有对此函数提供定义后,才能具备函数的功能,才能被调用。它仅仅是在基类汇总为其派生类保留一个函数的名字,以方便派生类根据需要对它定义。
类模板在构造线性表中的意义
亦为了是实现程序的多态性。
其定义为
template <class T>//T为虚拟类型名,表示某一类的“类”的名称
class A{ //类模板的名为A
(成员函数)
}
实例化的形式为
类模板名<具体类型>对象名[(构造函数实参列表)]
A<int>INTA(6,8);
A<double>DOUBLEA(6.6,6.8);
运算符重载在构造线性表中的意义
亦为了是实现程序的多态性。
函数类型 operation 运算符名称(形参列表)//根据形参表的不同以实现重载操作
{
运算符重载处理
}
线性表的存储表示
线性表是一种逻辑结构
线性表的存储表示有两种,顺序存储和链表存储。基于数组的存储表示叫做顺序表;基于指针的存储表示叫做链表(单链表、双链表、循环链表等)。