线性表是由零个或多个数据元素组成的集合,数据元素在位置上有序排列的,数据元素的个数是有限的,数据元素的类型必须相同,线性表可用于描述排队关系的问题,线性表(List)的抽象定义如下,ai是表项(数据元素),n是表长度
线性表的性质:
a0为线性表的第一个元素,只有一个后继
an-1为线性表的最后一个元素,只有一个前驱
除a0和an-1外的其他元素ai既有前驱,又有后继
直接支持逐项访问和顺序存取
线性表在程序中表现为一种特殊的数据类型,在C++中我们可以用线性表类模板来表示这一种数据结构,这是一个抽象类模板,是用来被继承的
template <typename T>
class List : public Object
{
public:
virtual bool insert(int i,const T& e) = 0;
virtual bool remove(int i) = 0;
virtual bool set(int i,const T& e) = 0;
virtual bool get(int i,T&e)const = 0;
virtual int length()const = 0;
virtual void clear() = 0;
}
线性表的顺序存储结构:
指的是用一段地址连续的存储单元依次存储线性表中的数据元素,数组就是一种连续存储的数据结构,对于顺序存储结构的元素插入操作,首先判断目标位置是否合法,将目标位置之后的所有元素后移一个位置,将新元素插入目标位置,线性表长度加1, 对于顺序存储结构的元素删除操作,首先判断目标位置是否合法,将目标位置后的所有元素前移一个位置,线性表长度减1
我们这里定义一个父类抽象类SeqList用以被子类StaticList和DynamicList继承,使其能够实现静态数组和动态数组的创建
SeqList.h
#ifndef SEQLIST_H
#define SEQLIST_H
#include "list.h"
#include "Exception.h"
namespace CGSLib
{
template <typename T>
class SeqList : public List<T>
{
protected:
int* m_array;
int m_length;
bool instert(int i,T& e)
{
bool ret = ((0<=i)&&(i<=m_length));
ret = ret && (m_length<capacity());
if(ret)
{
for(int p=m_length-1;p>=i;p--)
{
m_array[p+1] = m_array[p];
}
m_array[i] = e;
m_length ++;
}
return ret;
}
bool remove(int i)
{
bool ret = ((0<=i)&&(i<m_length));
if(ret)
{