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

来源:互联网 发布:qq聊天记录数据恢复 编辑:程序博客网 时间:2024/05/22 15:48

这是最简单的顺序表,顺序表中的元素都存储在数组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;      }}

原创粉丝点击