您的位置:首页 > 编程语言 > C语言/C++

C++顺序表的构建(用数组存储数据)

2017-08-20 20:46 351 查看
这是最简单的顺序表,顺序表中的元素都存储在数组T *data中

const int defaultSize = 100;
template <class T>
class LinearList
{
protected:
T *data;
int maxSize;
int last;
void reSize(int newSize);//改变数组的大小
public:
LinearList(int sz = defaultSize);
LinearList(LinearList<T> &L);
~LinearList()
{
delete[]data;
}
int Size()const
{
return maxSize;
}
int Length()const
{
return last + 1;
}
int Search(T &x)const;
int Locate(int i)const;
bool getData(int i, T &x)const
{
if(i > 0 && i <= last + 1)
{
x = data[i + 1];
return true;
}
else return false;
}
void setData(int i, T &x)const
{
if(i > 0 && i <= last + 1) data[i - 1] = x;
}
bool Insert(int i, T &x)const;
bool Remove(int i, T &x)const;
bool IsEmpty(){return (last==-1) ? true : false;}
bool IsFull(){return (last+1==maxSize) ? true : false;}
void input();
void output();
LinearList<T> operator=(LinearList<T> &L);
};

//构造函数
template<class T>
LinearList<T>::LinearList(int sz){
if(sz>0){
data=new T[sz];
if(data==NULL){cerr<<"内存分配失败!"; exit(1);}
last=-1;
maxSize=sz;
}
}

//复制构造函数
template<class T>
LinearList<T>::LinearList(LinearList<T> &L){
maxSize=L.Size();
last=L.Length()-1;
data=new T[maxSize];
if(data==NULL){cerr<<"内存分配失败!"; exit(1);}
T value;
for(int i=0; i<=last;i++){
L.getData(i+1, value);//从中获取值
data[i]=value;
}
}

template<class T>
void LinearList<T>::reSize(int newSize){
if(newSize<=last+1){ cerr<<"数组空间太小!"<<endl; return;}
if(newSize!=maxSize){
T *arr=new T[newSize];
if(arr==NULL){ cerr<<"内存分配失败!"; exit(1);}
maxSize=newSize;
for(int i=0; i<=last;i++){
arr[i]=data[i];
}
delete []data;
data=arr;
}
}

template<class T>
int LinearList<T>::Search(T &x)const{
for(int i=0; i<=last;i++){
if(data[i]==x)return i+1;
}
return -1;//搜索失败
}
//确定这个位置是否有数
template<class T>
int LinearList<T>::Locate(int i)const{
if(i<=0||i>last+1)return -1;
else return i;
}

template<class T>
void LinearList<T>::input(){
int num;
cout<<"开始建立顺序表,请输入表中元素个数:";
while(1){
cin>>num;
if(num>0&&num<=maxSize)break;
cout<<"您输入的数字太小或太大,要大于0并且小于等于"<<maxSize<<endl;
}
last=num-1;
for(int i=0;i<=last;i++){
cout<<"输入第"<<i+1<<"个元素:"<<endl; cin>>data[i];
}
}
template<class T>
void LinearList<T>::output(){
cout<<"顺序表当前元素最后的位置last为:"<<last<<endl;
for(int i=0;i<=last;i++)cout<<"第"<<i+1<<"个元素为:"<<data[i]<<endl;
}

template<class T>
bool LinearList<T>::Remove(int i, T &x)const
{
if(i > 0 && i <= last + 1)
{
x=data[i-1];
for(int j = i - 1; j<=last-1; j++)
data[j] = data[j + 1];
return true;
}
else return false;
}

template<class T>
bool LinearList<T>:: Insert(int i, T &x)const
{
if(i > 0 && i <= last + 1)
{
for(int j = last+1 ; j >=i; j--)
{
data[j] = data[j-1];
}
data[i - 1] = x;
return true;
}
else return false;
}

//其实和上面复制构造函数是一致的
template<class T>
LinearList<T> LinearList<T>::operator=(LinearList<T>& L){
maxSize=L.Size();
data=new T[maxSize];
if(data==NULL){cerr<<"内存分配失败"<<endl; exit(1);}
last=L.Length()-1;
T value;
for(int i=0;i<=last;i++){
L.getData(i+1,value);
data[i]=value;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: