#ifndef SEQLIST_H
#define SEQLIST_H
#include <iostream>
using namespace std;
const int defaultSize = 100;
const int increasement = 50;
template<class T>
class SeqList
{
public:
SeqList(int sz = defaultSize);
SeqList(SeqList<T> &L);
~SeqList()
{
delete []data;
}
int Size()const //计算表最大可容纳的表项的个数
{
return maxSize;
}
int Length()const //计算表的长度
{
return last+1;
}
int Search(T &x)const; //搜索x在表中的位置,函数返回表项序号
int Locate(int i)const; //定位第i个表项,函数返回表项序号
bool GetData(int i,T &x)const //取第i个表项的值
{
if (i > 0 && i <= last+1)
{
x = data[i-1];
return true;
}
else
return false;
}
void SetData(int i,T &x) //用x修改第i个表项的值
{
if (i > 0 && i <= last+1)
data[i-1] = x;
}
bool Insert(int i,T &x); //插入x在第i个表项之后
bool Remove(int i,T &x); //删除第i个表项,通过x返回表项的值
bool IsEmpty()const //判断表是否为空,空则返回true,否则返回false
{
return (last == -1) ? true : false;
}
bool IsFull()const //判断表是否已满,满则返回true,否则返回false
{
return (last == maxSize-1) ? true : false;
}
void Input(); //输入
void Output(); //输出
SeqList<T> operator= (SeqList<T> &L); //表的整体赋值
protected:
T *data; //存放数组
int maxSize; //最大可容纳表项的项数
int last; //当前已存放表项的最后位置(从开始)
void reSize(int newSize); //改变data数组空间的大小
};
/
// SeqList函数的实现 //
/
//构造函数,通过指定参数sz定义数组长度
template<class T>
SeqList<T>::SeqList(int sz)
{
if (sz > 0)
{
maxSize = sz;
last = -1;
data = new T[maxSize];
if (data == NULL)
{
cerr<<"存储分配错误!"<<endl;
exit(1);
}
}
}
//复制构造函数,用参数表中给出的已有顺序表初始化新建的顺序表
template<class T>
SeqList<T>::SeqList(SeqList<T> &L)
{
maxSize = L.Size();
last = L.Length()-1;
data = new T[maxSize];
if (data == NULL)
{
cerr<<"存储分配错误!"<<endl;
exit(1);
}
for(int i = 0;i <= last;++i)
L.GetData(i+1,data[i]);
}
//扩充顺序表的存储数组空间大小,新数组的元素个数为newSize
template<class T>
void SeqList<T>::reSize(int newSize)
{
if (newSize <= 0)
{
cerr<<"无效的数组大小"<<endl;
return;
}
if (newSize != maxSize)
{
T *newarray = new T[newSize];
if (newarray == NULL)
{
cerr<<"存储分配错误"<<endl;
exit(1);
}
for (int i = 0;i <= last;++i)
*(newarray+i) = *(data+i);
delete []data;
data = newarray;
maxSize = newSize;
}
}
//搜索函数:在表中顺序搜索与给定值x匹配的表项,找到则函数返回该表项是第几个元素,
//否则函数返回,表示搜索失败
template<class T>
int SeqList<T>::Search(T &x)const
{
for (int i = 0;i <= last;++i)
if(data[i] == x)
return i+1;
return 0;
}
//定位函数:函数返回第i(<= i <= last+1)个表项的位置,否则返回-1,表示定位失败
template<class T>
int SeqList<T>::Locate(int i)const
{
if(i >=1 && i <= last+1)
return i-1;
else
return -1;
}
//插入函数:将新元素x插入到表中第i(<= i <=last+1)个表项之后。函数返回插入成功的信息,
//若插入成功,则返回true;否则返回false,i=0是虚拟的,实际上是插入到第个元素位置
template<class T>
bool SeqList<T>::Insert(int i,T &x)
{
if(last == maxSize-1) //表满,重新调整数组大小
{
maxSize += increasement;
reSize(maxSize);
}
if(i < 0 || i > last+1) //参数i不合理,不能插入
return false;
for(int j = last;j >= i;--j) //依此后移,空出第i号位置
data[j+1] = data[j];
data[i] = x;
last++;
return true;
}
//删除函数:从表中删除第i(<= i <= last+1)个表项,通过引用型参数x返回删除的元素值,
//若删除成功则返回true,否则返回false
template<class T>
bool SeqList<T>::Remove(int i,T &x)
{
if(last == -1)
return false;
if(i<1 || i>last+1)
return false;
x = data[i-1];
for(int j = i;j <= last;++j)
data[j-1] = data[j];
last--;
return true;
}
//输入函数:从标准输入(键盘)逐个数据输入,建立顺序表
template<class T>
void SeqList<T>::Input()
{
cout<<"开始建立顺序表,请输入表中元素的个数:";
while (1)
{
cin>>last;
if (last <= maxSize)
{
--last;
break;
}
cout<<"表元素个数输入有误,范围不能超过"<<maxSize<<":"<<endl;
}
cout<<"请依次输入这"<<last+1<<"个元素:"<<endl;
for (int i = 0;i <= last;++i)
{
cin>>data[i];
}
}
//输出函数:将顺序表全部元素输出到屏幕上
template<class T>
void SeqList<T>::Output()
{
cout<<"当前顺序表含有的元素个数为:"<<last+1<<endl;
for(int i = 0;i <= last;++i)
cout<<"#"<<i+1<<":"<<data[i]<<endl;
}
//赋值运算重载:顺序表整体赋值
template<class T>
SeqList<T> SeqList<T>::operator= (SeqList<T> &L)
{
delete []data;
maxSize = L.Size();
last = L.Length()-1;
data = new T[maxSize];
if (data == NULL)
{
cerr<<"存储分配错误!"<<endl;
exit(1);
}
for(int i=0;i<=last;++i)
L.GetData(i+1,data[i]);
return *this;
}
#endif