顺序表 C++模板实现

时间:2023-03-09 22:28:33
顺序表 C++模板实现
#include <iostream>
using namespace std; template <typename T>
class list{
private:
int maxLen; //顺序表能允许的最大长度
int num; //当前表中的元素个数
T *data; //保存T类型数组首地址
public:
list(int max); //构造函数
~list(); //析构函数
void add(const T x); //在最后一个元素后增加一个元素x
void insert(int i , T x); //在下标为i的元素处增加一个元素x
void dele(int i); //删除下标为i的元素
void set(int i, T x); //设置下标为i的元素的值
int locate(T x); //查找第一个与x相同元素的下标
T get(int i); //返回下标为i的元素
void printAll(); //打印整个顺序表
}; //构造函数实现
template <typename T>
list<T>::list(int max){
maxLen = max; //顺序表最大长度
data = new T[maxLen]; //动态数组
num=0;
} //析构函数实现
template <typename T>
list<T>::~list(){
delete [] data; //释放动态数组
} //在最后一个元素后增加一个元素x,实现部分
template <typename T>
void list<T>::add(T x){
data[num]= x;
num++;
} //在下标为i的元素处增加一个元素x,实现部分
template <typename T>
void list<T>::insert(int i ,T x){
if(i<0 && i>num-1){ //判断插入位置是否介于下标0与num-1之间
cerr<<"插入位置有误"<<endl;
exit(1);
}
else if(num == maxLen){ //判断表是否满了
cerr<<"顺序表已满,无法插入" <<endl;
exit(1);
}
int j = num;
while(j>i){
data[j] = data[j-1];
j--;
}
data[i] = x;
num++;
} //删除下标为i的元素,实现部分
template <typename T>
void list<T>::dele(int i){
if(i<0 && i>num-1){ //判断删除位置是否介于下标0与num-1之间
cerr<<"删除位置有误"<<endl;
exit(1);
}
int j = i+1;
while(j<num){
data[j-1] = data[j];
j++;
}
num--;
} //设置下标为i的元素的值,实现部分
template <typename T>
void list<T>::set(int i , T x){
data[i] = x;
} //查找第一个与x相同元素的下标,实现部分
template <typename T>
int list<T>::locate(T x) {
for(int i = 0 ; i < num ; i++){
if(data[i] == x)
return i;
}
return -1;
} //返回下标为i的元素,实现部分
template <typename T>
T list<T>::get(int i){
return data[i];
} //打印整个顺序表,实现部分
template <typename T>
void list<T>::printAll(){
for(int i = 0 ; i <num ; i++){
cout<<data[i]<<endl;
}
}
void main(){
list<int> a(10); //创建元素类型为int,最大长度为10的顺序表
a.add(1); //增加一个元素,元素值为1
a.add(2); //增加一个元素,元素值为2
a.add(3); //增加一个元素,元素值为3
a.add(4); //增加一个元素,元素值为4
a.add(5); //增加一个元素,元素值为5
a.insert(4,0); //在下表为4的元素,插入一个值为0的元素
a.dele(4); //删除上次插入的元素
a.set(0,9); //设置下标为0的元素的值为9
a.printAll(); //打印所有元素的值
}