#include<iostream>
using namespace std;
template<class T>
class linearList{
public:
virtual ~linearList(){};
virtual bool empty() const = 0; //判断线性表是否为空
virtual int size() const = 0; //返回线性表的元素个数
virtual T & get(int theindex) const = 0;//返回索引为theindex的元素值
virtual int indexof(const T& theelement) const = 0;//返回元素theelement第一次出现的索引
virtual void erase(int theindex) = 0;//删除索引为theindex 的元素值
virtual void insert(int index, const T& theelement) = 0;//把元素theelement插入到索引为index的位置
virtual void output() const = 0;//输出线性表
};
template<class T>
class arrayList : public linearList<T>
{
public:
//构造函数和复制构造函数
arrayList(int initial);
arrayList(const arrayList<T> &);
~arrayList(){
delete [] element;
}
//ADT方法
bool empty() const {return listSize == 0;};
int size () const {return listSize;};//当前元素的个数
T & get(int theindex) const;
int indexof(const T& theelement) const;
void erase(int theindex);
void insert(int theindex, const T& theelement);
void output() const;
int capacity()const{return arrayLength;}//当前数组的长度
private:
void checkIndex(int theindex) const;///若索引无效抛出异常
T *element;//存储线性表元素的数组
int arrayLength; //数组的容量
int listSize; //线性表的个数
};
/*构造函数*/
template<class T>
arrayList<T> :: arrayList(int initial)
{
if(initial < 1)
{
cout << "initial capacity = " << initial << "must be > 0" << endl;
}
arrayLength = initial;
element = new T[arrayLength];
listSize = 0;
}
/*复制类的构造函数*/
template<class T>
arrayList<T> :: arrayList(const arrayList<T>& thlist)
{
arrayLength = thlist.arrayLength;
listSize = thlist.listSize;
element = new T[arrayLength];
copy(thlist.element, thlist.element+listSize, element);
}
/*检查索引是否在范围内*/
template<class T>
void arrayList<T> :: checkIndex(int theindex) const
{
if(theindex < 0 || theindex >=listSize)
{
cout << "index=" << theindex << "is not included\n";
}
}
/*通过索引返回元素*/
template<class T>
T& arrayList<T> :: get(int theindex) const
{
//判断元素是否存在
checkIndex(theindex);
return element[theindex];
}
/*通过元素返回索引值*/
template<class T>
int arrayList<T> :: indexof(const T& theelement) const
{
int theindex;
for(int i=0; i<listSize; i++)
{
if(theelement == element[i])
{
theindex = i;
}
}
//theindex = (int) find((element, element+listSize, theelement)-element);//find返回迭代器
if(theindex == listSize)
{
return -1;//没有查找到
}
return theindex;
}
/*根据索引删除元素*/
template<class T>
void arrayList<T> :: erase(int theindex)
{
checkIndex(theindex);
copy(element+theindex+1, element+listSize, element+theindex);//引索存在就往后移动一个位置
element[--listSize].~T();
}
/*线性表的输出*/
template<class T>
void arrayList<T> :: output()const
{
for(int i=0; i<listSize; i++)
{
cout << element[i];
}
}
/*改变数组长度*/
template<class T>
void changelength(T*& a, int oldlength, int newlength)
{
if(newlength<0)
{
cout << "the newlength can not < 0\n";
}
T *temp = new T[newlength];
int number = min(oldlength, newlength);
copy(a, a+number, temp);
a = temp;
}
/*在索引index的位置插入一个元素*/
template<class T>
void arrayList<T> :: insert(int theindex, const T& theelement)
{
if(theindex < 0 || theindex > listSize )
{
cout << "teh theindex is not included\n";
}
if(listSize == arrayLength)
{
changelength(element, arrayLength, 2*arrayLength);
arrayLength = arrayLength * 2;
}
copy_backward(element+theindex, element+listSize, element+listSize+1);
element[theindex] = theelement;
listSize++;
}
总结:
1.抽象数据类型
抽象数据类型
{
实际例子:(有限个元素的集合)
操作:
判断线性表是否为空(bool)
返回线性表的大小
返回线性表中索引为index的数值
…………
};
2. 模版和派生函数的运用
一个抽象类的派生类,只有实现了基类的所有纯虚函数才是具体类,否则抽象依旧不能实例化