逻辑描述
用一段地址连续的存储单元依次存储数据元素
实现
1、C++中用数组存储顺序表
2、顺序表是一种随机存取结构 LOC(ai)=LOC(a1)+(i-1)×c
3、线性表中的元素类型不固定,所以需要使用模板机制
const int MAXSIZE = 1000;
template <class T> class SeqList {
public:
SeqList();
SeqList(const T a[], int n);
int GetLength(); //顺序表长度
T Get(int i); //获取第i个位置元素
int Locate(T x); //查找值为x的元素
void Insert(int i, T x); //插入x元素,在第i个位置
T Delete(int i); //删除第i个元素
void PrintList (); //打印各元素
private:
T data[MAXSIZE]; //存储顺序表的数组
int length; //顺序表的长度
};
初始化–构造函数
无参构造函数:用于建立空顺序表
template <class T>
SeqList<T>::SeqList () {length=0;}
有参构造函数:创建一个长度为n的顺序表 ——使用含有n个元素的数组a初始化
伪代码
[1] 若n太大,则抛出异常
[2] 将数组a中的各个元素赋值到data数组中
[3] 修改顺序表长度
//有参构造函数,使用含有n个元素的数组a初始化
template <class T>
SeqList<T>::SeqList(const T a[], int n)
{
if (n>MAXSIZE) throw "数组长度超过顺序表的最大长度";
for (int i=0;i<n;i++)
data[i]=a[i];
length=n;
}
遍历
template <class T>
void SeqList<T>::PrintList()
{
cout << "按序号依次遍历线性表中的各个数据元素:" << endl;
for (int i=0;i<length;i++)
cout << data[i] << " ";
cout << endl;
}
插入
伪代码
[1] 若表满,则抛出上溢异常
[2] 若插入位置错误,则抛出位置异常
[3] 从最后一个元素到第i个元素,顺序后移
[4] 将x存放到第i个元素位置
[5] 修改顺序表长度加1
void SeqList<T>::Insert(int i, T x)
{
if (Length>Maxsize) throw "上溢异常";
if (i<1||i>Length+1) throw "位置异常";
for(int j=Length;j<i;j--)
data[j]=data[j-1];
data[i-1]=x;
Length++;
}
删除
伪代码
[1] 如果表空,则抛出下溢异常;
[2] 如果删除元素位置不合理,则抛出位置异常;
[3] 取出将被删除的元素;
[4] 依次从第i+1个元素开始到第n个元素分别前移一个位置;
[5] 表长减1,并返回被删元素的值。
T SeqList<T>::Delete(int i)
{
if (Length==0) throw"下溢异常";
if (i>length||i<1) throw "位置异常";
T x=data[i-1];
for(int j=i;j<Length;j++)
data[j-1]=data[j];
Length--;
}
查找
按值查找
//查找线性表中值为x的元素,找到后返回其位置
//设data[0]默认不存储顺序表数据元素
template <class T>
int SeqList<T>::Locate(const T x)
{
data[0]=x;
int i=length;
while (x!=data[i]) i--;
return i;
}
按位查找
//获取线性表第i个位置上的元素
template <class T>
T SeqList<T>::Get(int i)
{
if (i<1||i>length) throw "查找位置非法";
return data[i-1];
}
顺序表应用举例
#include "SeqList.h"
void main()
{
int a[7]={1,2,3,4,5,6,7};
SeqList <int> list(a,7);
list.PrintList ();
list.Insert (1,0);
list.PrintList ();
int x = list.Delete (8);
cout << "删除元素:"<< x << endl;
list.PrintList ();
int p = list.Locate (4);
cout << "元素4的位置:" << p << endl;
}
小结
SeqList的实质是一个容器,用来存储同类型的多个数据,并且封装了一些算法,以简化上层的应用。
优点
1 结构简单
2 可直接定位表中元素,随机查找速度快
缺点
1 存储空间静态分配,难以选择合适的存储容量。
2 插入删除需要移动大量元素,平均需要移动一半元素,效率较低。