需注意,数据结构中的数据类型储存的都是“结构”,如下面的数组列表,虽然是基于数组,但是不像之前acmn中那样一个数据类型表示一个数,而是表示一个列表。
故声明私有成员时,E *listarr; 用于存放数组的指针位置。
#include <iostream>
using namespace std;
template <typename E>
class AList {
private:
int maxsize; //列表的最大容量
int listsize; //当前列表的元素个数
int curr; //当前元素的数组下标,用于插入时为动作指路
E *listarr;
public:
AList(){}
AList(int size) //constructor
{
maxsize = size;
listsize = -1;
curr = 0;
listarr = new E[size];
}
~AList(){}//destructor
void clear(){ //清空整个列表
delete []listarr;
curr = 0;
listsize = -1;
listarr = new E[maxsize];
}
void insert(const E& it){
// Assert(listsize < maxsize, "数组越界!"); //这句话用来检查数组越界
for(int i = listsize; i > curr; i--)
listarr[i] = listarr[i-1];
listarr[curr] = it;
listsize++;
}
void append(const E& it){
// Assert(listsize < maxsize, "数组越界!");
listarr[listsize++] = it;
}
E remove()
{
// Assert(listsize < maxsize, "数组越界!");
E leave = listarr[curr];
for(int i = curr; i < listsize; i++)
listarr[i] = listarr[i+1];
listsize--;
return leave;
}
void modicurr(int num){
// Assert((num <= listsize) && (num >= 0), "数组越界!");
curr = num;}
//书上写了若干函数用于更改curr,我保留prev和next函数,其他全部合成这一个modicurr函数
//仅作修改curr的功能
void prev(){ if(curr !=0) curr--;}
void next(){ if(curr<listsize) curr++;}
int length() const { return listsize+1;}
int currpos() const{ return curr;}
const E& getvalue() const{ //返回当前的元素
//Assert((curr <= listsize) && (curr >= 0), "当前查询出错!");
return listarr[curr];
}
};
int main() {
AList <int>test;
test = AList<int>(4);
test.insert(1);test.insert(2);test.insert(3);test.insert(4);
//注意,这样做相当于在反向插入
test.modicurr(2);
cout<<test.getvalue();
}