写成员函数的时候参考了下严蔚敏的数据结构(C语言版)
/*
顺序表的类模板
有以下功能:
1.CreateSqlist用长度为n,容量为c,类型为T的数组a创建顺序表
2.displaylist按顺序输出表中元素
3.Sqempty检测表是否为空,为空返回1,否则返回0
4.Sqlen输出并返回表的长度
5.getelem返回下标为i的元素
6.locElem从第一个元素开始,寻找并返回第一个与e满足谓词compare的元素的下标
7.ListInsert在i位置插入类型为T的元素
8.Delete删除下标为i的元素
9.pushback尾插
10.pushfront头插
11.popback尾删
12.popfront头删
13.cheakV检查容量是否为满,为满则追加分配10个数据的容量,否则什么都不做
14.compare(T a,T b)如果a<b则返回true,否则返回false;
作者:chczy
*/
#include<iostream>
#include<algorithm>
#include<new>
using namespace std;
#define MAXSIZE 1000
#define Realloc 10
//顺序表
template <class T>
class Sqlist {
public:
bool CreateSqlist(T a[], int n, int c);
void displaylist();
bool Sqempty();
int Sqlen();
T getelem(int i);
int locElem(T e,int compare(T a,T b));//取满足条件的元素
void ListInsert(int i, T e);
void Delete(int i);
void pushback(T e);
void pushfront(T e);
void popback();
void popfront();
void cheakV();//检查顺序表容量是否满了
bool compare(T e,T d);
Sqlist();
Sqlist(const Sqlist&);
Sqlist& operator=(const Sqlist&);
~Sqlist() { cout << "destory Sqlist" << endl; }
private:
T *data;
int len;
int cap;
};
template <class T>
bool Sqlist<T>::compare(T e,T d)
{
return e < d;
}//比较两T元素的大小
template <class T>
Sqlist<T>::Sqlist()//创建一个空表
{
cap = MAXSIZE;
data = new T[cap];
len = 0;
}
template <class T>
bool Sqlist<T>::CreateSqlist(T a[], int n, int c)//传入一个T类型的数组以及数组长度和数组容量来创建线性表;
{
if (Sqempty())
{
cap = c;
len = n;
T *now = new T[cap];
for (int i = 0; i < len; ++i)
{
now[i] = a[i];
}
delete[] data;
data = now;
now = NULL;
delete now;
return 1;
}
else
return 0;
}
template <class T>
void Sqlist<T>::displaylist()//打印顺序表中所有元素
{
if (len == 0)
{
cout << "null list!" << endl;
return;
}
cout << "The Sequence List's length is " << len << endl;
cout << "It's elems is:";
for (int i = 0; i < len; ++i)
cout << data[i] << " ";
cout << endl;
}
template <class T>
bool Sqlist<T>::Sqempty()//判断顺序表是否为空
{
if (len == 0)
return 1;
else
return 0;
}
template <class T>
int Sqlist<T>::Sqlen()//返回表的长度
{
cout << "表长为:" << endl;
cout << len << endl;
return len;
}
template <class T>
T Sqlist<T>::getelem(int i)//取下标为i的元素
{
return data[i];
}
template <class T>
int Sqlist<T>::locElem(T e,int compare(T a,T b))//寻找表中第一个满足compare条件额=的元素,compare自写
{
int i;
for (i = 0; i < len; ++i)
{
if (compare(e,data[i]))
{
return i;
}
}
if (i >= len)
{
cout << "NOT THIS ELEM!" << endl;
return 0;
}
}
template <class T>
void Sqlist<T>::cheakV()//检查标的容量是否为满
{
if (len >= cap)
{
cap += Realloc;
T *now = new T[cap];
for (int i = 0; i < len; ++i)
{
now[i] = data[i];
}
delete[] data;
data = now;
now = NULL;
}
}
template <class T>
void Sqlist<T>::pushback(T e)//尾插
{
cheakV();
data[len] = e;
++len;
}
template <class T>
void Sqlist<T>::pushfront(T e)//头插
{
cheakV();
for (int j = len; j > 0; --j)
{
data[j] = data[j - 1];
}
data[0] = e;
++len;
}
template <class T>
void Sqlist<T>::popback()//尾删
{
if (len == 0)
throw"error,no elem!\n";
else
{
--len;
T *now = new T[cap];
for (int i = 0; i < len; ++i)
{
now[i] = data[i];
}
delete[] data;
data = now;
now = NULL;
}
}
template <class T>
void Sqlist<T>::popfront()//头删
{
if (len == 0)
throw"no elem!\n";
else if (len == 1)
popback();
else
{
for (int j = 0; j < len - 1; ++j)
{
data[j] = data[j + 1];
}
--len;
T *now = new T[cap];
for (int i = 0; i < len; ++i)
{
now[i] = data[i];
}
delete[] data;
data = now;
now = NULL;
}
}
template <class T>
void Sqlist<T>::ListInsert(int i, T e)//在i位置插入一元素
{
if (i > len)
throw"error,out of range\n";
cheakV();
if (i == len)
pushback(e);
else if (i == 0)
pushfront(e);
else
{
for (int j = len-1; j >= i; --j)
{
data[j+1] = data[j];
}
data[i] = e;
++len;
}
}
template <class T>
void Sqlist<T>::Delete(int i)//删除下标为i的元素
{
if (i >= len)
throw"error,over range\n";
if (i == len - 1)
popback();
else if (i == 0)
popfront();
else
{
int j;
for (j = i; j < len; ++j)
data[j] = data[j + 1];
--len;
T *now = new T[cap];
for (j = 0; j < len; ++j)
{
now[j] = data[j];
}
delete[] data;
data = now;
now = NULL;
}
}
template <class T>
Sqlist<T>& Sqlist<T>::operator=(const Sqlist &rhs)//定义=运算符
{
data = rhs.data;
len = rhs.len;
cap = rhs.cap;
return *this;
}
template<class T>
Sqlist<T>::Sqlist(const Sqlist &rhs)//拷贝构造函数
{
data = rhs.data;
len = rhs.len;
cap = rhs.cap;
return *this;
}