顺序表

来源:互联网 发布:桃花姬 知乎 编辑:程序博客网 时间:2024/04/25 15:47

 

#ifndef SEQLIST_H

#define SEQLIST_H

 

#include <iostream>

using namespace std;

 

const int defaultSize = 100;

const int increasement = 50;

 

template<class T>

class SeqList

{

public:

     SeqList(int sz = defaultSize);

     SeqList(SeqList<T> &L);

     ~SeqList()

     {

         delete []data;

     }

     int Size()const    //计算表最大可容纳的表项的个数

     {

         return maxSize;

     }

     int Length()const  //计算表的长度

     {

         return last+1;

     }

     int Search(T &x)const; //搜索x在表中的位置,函数返回表项序号

     int Locate(int i)const; //定位第i个表项,函数返回表项序号

     bool GetData(int i,T &x)const    //取第i个表项的值

     {

         if (i > 0 && i <= last+1)

         {

              x = data[i-1];

              return true;

         }

         else

              return false;

     }

     void SetData(int i,T &x)    //x修改第i个表项的值

     {

         if (i > 0 && i <= last+1)

              data[i-1] = x;

     }

     bool Insert(int i,T &x);    //插入x在第i个表项之后

     bool Remove(int i,T &x);    //删除第i个表项,通过x返回表项的值

     bool IsEmpty()const    //判断表是否为空,空则返回true,否则返回false

     {

         return (last == -1) ? true : false;

     }

     bool IsFull()const //判断表是否已满,满则返回true,否则返回false

     {

         return (last == maxSize-1) ? true : false;

     }

     void Input(); //输入

     void Output();     //输出

     SeqList<T> operator= (SeqList<T> &L); //表的整体赋值

protected:

     T *data; //存放数组

     int maxSize;  //最大可容纳表项的项数

     int last; //当前已存放表项的最后位置(从开始)

     void reSize(int newSize);   //改变data数组空间的大小

};

 

/////////////////////////////////////////////////////////////////////////////////

//                                   SeqList函数的实现                                //

/////////////////////////////////////////////////////////////////////////////////

 

//构造函数,通过指定参数sz定义数组长度

template<class T>

SeqList<T>::SeqList(int sz)

{

     if (sz > 0)

     {

         maxSize = sz;

         last = -1;

         data = new T[maxSize];

         if (data == NULL)

         {

              cerr<<"存储分配错误!"<<endl;

              exit(1);

         }

     }

}

 

//复制构造函数,用参数表中给出的已有顺序表初始化新建的顺序表

template<class T>

SeqList<T>::SeqList(SeqList<T> &L)

{

     maxSize = L.Size();

     last = L.Length()-1;

     data = new T[maxSize];

     if (data == NULL)

     {

         cerr<<"存储分配错误!"<<endl;

         exit(1);

     }

     for(int i = 0;i <= last;++i)

         L.GetData(i+1,data[i]);

}

 

//扩充顺序表的存储数组空间大小,新数组的元素个数为newSize

template<class T>

void SeqList<T>::reSize(int newSize)

{

     if (newSize <= 0)

     {

         cerr<<"无效的数组大小"<<endl;

         return;

     }

     if (newSize != maxSize)

     {

         T *newarray = new T[newSize];

         if (newarray == NULL)

         {

              cerr<<"存储分配错误"<<endl;

              exit(1);

         }

         for (int i = 0;i <= last;++i)

              *(newarray+i) = *(data+i);

         delete []data;

         data = newarray;

         maxSize = newSize;

     }

}

 

//搜索函数:在表中顺序搜索与给定值x匹配的表项,找到则函数返回该表项是第几个元素,

//否则函数返回,表示搜索失败

template<class T>

int SeqList<T>::Search(T &x)const

{

     for (int i = 0;i <= last;++i)

         if(data[i] == x)

              return i+1;

     return 0;

}

 

//定位函数:函数返回第i<= i <= last+1)个表项的位置,否则返回-1,表示定位失败

template<class T>

int SeqList<T>::Locate(int i)const

{

     if(i >=1 && i <= last+1)

         return i-1;

     else

         return -1;

}

 

//插入函数:将新元素x插入到表中第i<= i <=last+1)个表项之后。函数返回插入成功的信息,

//若插入成功,则返回true;否则返回false,i=0是虚拟的,实际上是插入到第个元素位置

template<class T>

bool SeqList<T>::Insert(int i,T &x)

{

     if(last == maxSize-1)  //表满,重新调整数组大小

     {

         maxSize += increasement;

         reSize(maxSize);

     }

     if(i < 0 || i > last+1) //参数i不合理,不能插入

         return false;

     for(int j = last;j >= i;--j)     //依此后移,空出第i号位置

         data[j+1] = data[j];

     data[i] = x;

     last++;

     return true;

}

 

//删除函数:从表中删除第i<= i <= last+1)个表项,通过引用型参数x返回删除的元素值,

//若删除成功则返回true,否则返回false

template<class T>

bool SeqList<T>::Remove(int i,T &x)

{

     if(last == -1)

         return false;

     if(i<1 || i>last+1)

         return false;

     x = data[i-1];

     for(int j = i;j <= last;++j)

         data[j-1] = data[j];

     last--;

     return true;

}

 

//输入函数:从标准输入(键盘)逐个数据输入,建立顺序表

template<class T>

void SeqList<T>::Input()

{

     cout<<"开始建立顺序表,请输入表中元素的个数:";

     while (1)

     {

         cin>>last;

         if (last <= maxSize)

         {

              --last;

              break;

         }

         cout<<"表元素个数输入有误,范围不能超过"<<maxSize<<""<<endl;

     }

     cout<<"请依次输入这"<<last+1<<"个元素:"<<endl;

     for (int i = 0;i <= last;++i)

     {

         cin>>data[i];

     }

}

 

//输出函数:将顺序表全部元素输出到屏幕上

template<class T>

void SeqList<T>::Output()

{

     cout<<"当前顺序表含有的元素个数为:"<<last+1<<endl;

     for(int i = 0;i <= last;++i)

         cout<<"#"<<i+1<<""<<data[i]<<endl;

}

 

//赋值运算重载:顺序表整体赋值

template<class T>

SeqList<T> SeqList<T>::operator= (SeqList<T> &L)

{

     delete []data;

     maxSize = L.Size();

     last = L.Length()-1;

     data = new T[maxSize];

     if (data == NULL)

     {

         cerr<<"存储分配错误!"<<endl;

         exit(1);

     }

     for(int i=0;i<=last;++i)

         L.GetData(i+1,data[i]);

     return *this;

}

 

#endif

 

原创粉丝点击