#include
using namespace std;
template
class SqList
{
private:
ElemType *elem; // 存储空间基址
int length; // 当前长度 从 1 开始计数
int listsize; // 允许的最大存储容量(以sizeof(ElemType)为单位
public:
//初始化顺序表
SqList(int ms = 20);
//删除顺序表
~SqList(){delete [] elem;}
//将顺序表置为空表
void ListClear( ){length = 0;}
//返回顺序表的长度
int ListLength() const {return length;}
//设置顺序表的长度
bool SetListLength(int len);
//判断顺序表是否为空表
bool ListEmpty() const{ return length == 0;}
//判断顺序表是否为满表
bool ListFull() const{ return length == listsize;}
//用e返回顺序表的第i个元素 length <= i>= 1 注: 参数 i 从 1开始计数
ElemType GetElem(int i) const{ return elem[i-1];}
// 使用前 手动判断 i 是否超过范围
// i 不是从0开始计数,否则此处下标就为 i
// 若 i > length 则得到的可能是无用数据或者抛异常(i >listsize时)
//用e设置顺序表的第i个元素 注: 参数 i 从 1开始计数
bool SetElem(int i, ElemType e)
{
if( i < 1) return false;
if( i > length)
{
if(length+1 > listsize) return false;
i = ++length; //相当于在末尾插入e
}
elem[i-1] = e;
return true;
}
//在顺序表的第pos个位置之前插入e元素
bool ListInsert(int pos,ElemType e);
//删除顺序表的第pos个位置的元素
bool ListDelete(int pos, ElemType &e);
//compare函数,用来判断a和b是否相等
bool compare(ElemType a, ElemType *b){return a == b;} //ElemType 要能够进行比较操作
//按指定条件查找
int LocateElem(ElemType e)
{
for(int i = 0; i < length ; ++i)
if(e == elem[i]) return i;
return -1;
}
//逆置顺序表
void Invert(int, int);
//返回线性表给定数据元素的前驱数据元素的值
bool PriorElem(ElemType cur_e, ElemType &pri_e)
{
int i = this->LocateElem(cur_e);
if (i <= 0) return false;
pri_e = elem[i-1];
return true;
}
//返回线性表给定数据元素的后继数据元素的值
bool NextElem(ElemType cur_e, ElemType &nex_e)
{
//参考上面一个函数
}
//销毁线性表
void ListDestroy()
{
delete []elem;
elem = NULL;
length = listsize = 0;
}
//遍历顺序表
template
int ListTraverse(const FUNC& callback) const
{
for(int i = 0; i < length; ++i)
callback(elem[i]);
return 0;
}
};
template
SqList
{
if(ms<=0) ms = 20;
elem = new T[ms];
length = 0;
listsize = ms;
}
template
bool SqList
{
if(len<=0) return false;
if(len <= listsize && len >= length)
{
//listsize = len;
}
else
{
T *tmp = new T[len];
if(len < length) length = len;
memcpy(tmp,elem,sizeof(T)*length);
listsize = len;
delete []elem;
elem = tmp;
}
return true;
}
template
bool SqList
{
if(length == listsize) return false; // FULL
if(pos > length)
{
elem[length++] = e;
return true;
}
if(pos < 1) pos = 1;
memmove(elem+pos,elem+pos-1,sizeof(T)*(length-pos+1));
elem[pos-1] = e;
++length;
return true;
}
//逆置顺序表
template
void SqList
{
if(begin < 1 || end < 1 || begin >= end || begin >= length ) return;
for(--begin,--end; begin!=end; ++begin,--end)
{
T t = elem[begin];
elem[begin] = elem[end];
elem[end] = t;
}
}