6.3w+
社区成员
//
//
//线线表的抽象基类定义
//
//
template <class T>
class LinearList{
public:
LinearList(); //构造函数
~LinearList(); //析构函数
virtual int size() const=0; //求表最大的容量
virtual int Length() const=0; //求表长度
virtual int Search(T &x) const=0; //在表中搜索给定值x
virtual int Locate(int i) const=0; //在表中定位第i个元素
virtual T* getData(int i) const=0; //取第i个元素
virtual void setData(int i,T& x)=0; //修改第i个元素的值为x
virtual bool Insert(int i,T& x)=0; //在第i个表项后插入x
virtual bool Remove(int i,T& x)=0; //删除第i个表项,通过x返回
virtual bool IsEmpty() const=0; //判断表空
virtual bool IsFull() const=0; //判断表满
virtual void Sort() =0; //排序
virtual void input()=0; //输入表项
virtual void output()=0 ; //输出表项
virtual LinearList<T> operator=(LinearList<T>& L)=0; //直接复制
};
#include<iostream.h>
#include<stdlib.h>
#include"LinearList.H"
const int defaultSize = 100;
template <class T>
class SeqList: public LinearList<T>{
protected:
T *data;
int maxSize;
int last;
void reSize(int newSize);
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;
int Locate(int i)const;
T *getData(int i)const
{return( i > 0 && i <= last+1 )?&data[i-1]:NULL;}
void setData(int i, T& x)
{ if( i > 0 && i <= last+1 ) data[i-1]=x;}
bool Insert(int i,T& x);
bool Remove(int i,T& x);
bool IsEmpty(){return (last==-1)?true:false;}
bool IsFull(){return (last==maxSize-1)?true:false;}
void input();
void output();
SeqList<T>operator=(SeqList<T>& L);
};
#include"SeqList.H"
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 = 1; i<=last+1; i++)
data[i-1] = L.getData(i);
}
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);}
int n=last+1;
T *srcptr =data;
T *desptr=newarray;
while(n--) *desptr++=*srcptr++;
delete [] data;
data = newarray; maxSize = newSize;
}
}
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;
}
template <class T>
int SeqList<T>::Locate(int i) const
{
if(i>=1&& i<=last+1) return i;
else return 0;
}
template <class T>
int SeqList<T>::Insert(int i, T& x)
{
if(last == maxSize-1) return false;
if(i<0 || i>last+1 ) return false;
for(int j=last ; j>=i ; j--)
data[j+1]=data[j];
data[i]=x;
last++;
return true;
}
template <class T>
int 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>
int SeqList<T>::input()
{
cout<<"开始建立顺序表,请输入表中元素个数:";
while(1)
{
cin>>last;
if( last <= maxSize-1 ) break;
cout<<"表元素个数输入有误,范围不能超过"<<maxSize-1<<"!";
}
for(int i = 0; i<=last ;i++)
{
cin>>data[i];
cout<<i+1<<endl;
}
}
template <class T>
int SeqList<T>::output()
{
cout<<"顺序表当前最后位置为:"<<last<<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)
{
SeqList<T> *temp=new SeqList<T>(L);//这个函数是我自己实现的
return *temp;
}
//基类 是const
virtual bool IsEmpty() const=0; //判断表空
virtual bool IsFull() const=0; //判断表满
//而继承确实 非 const
//随便修改啊!!
bool IsEmpty(){return (last==-1)?true:false;}
bool IsFull(){return (last==maxSize-1)?true:false;}