64,644
社区成员
发帖
与我相关
我的任务
分享
//
//
//线线表的抽象基类定义
//
//
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 T* getData(int i) const=0; //取第i个元素
virtual void setData(int i,T x)=0; //修改第i个元素的值为x
virtual int Insert(int i,T x)=0; //在第i个表项后插入x
virtual int Remove(int i,T& x)=0; //删除第i个表项,通过x返回
virtual int IsEmpty() const=0; //判断表空
virtual int IsFull() const=0; //判断表满
virtual void input()=0; //输入表项
virtual void output()=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;
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;}
int Insert(int i,T x);
int Remove(int i,T& x);
int IsEmpty()const{return (last==-1)?1:0;}
int IsFull()const{return (last==maxSize-1)?1:0;}
void input();
void output();
};
template <class T>
SeqList<T>::SeqList(int sz=defaultSize)
{
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;exit(1)}
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>::Insert(int i, T x)
{
if(last == maxSize-1) return 0;
if(i<0 || i>last+1 ) return 0;
for(int j=last ; j>=i ; j--)
data[j+1]=data[j];
data[i]=x;
last++;
return 1;
}
template <class T>
int SeqList<T>::Remove(int i, T &x)
{
if(last == -1) return 0;
if( i<1 || i>last+1) return 0;
x=data[i-1];
for(int j=i ;j<=last ;j++)
data[j-1]=data[j];
last--;
return 1;
}
template <class T>
void SeqList<T>::input()
{
cout<<"开始建立顺序表,请输入表中元素最后一个的下标数:";
while(1)
{
cin>>last;
if( last <= maxSize-1 ) break;
cout<<"表最后元素下标输入有误,范围不能超过"<<maxSize-1<<"!";
}
cout<<"当前顺序表长度为"<<last+1<<endl;
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<<endl;
for(int i=0 ;i<=last ; i++)
cout<<"#"<<"data["<<i<<"]"<<":"<<data[i]<<endl;
}
#include"SeqList.h"
void main()
{
//纯虚函数出错,调试中啊。。。。。
SeqList<char> temp(10);
temp.input();
temp.output();
cout<<"请输入你要插入的位置和数据:";
int i;
char dat;
cin>>i>>dat;
temp.Insert(i,dat);
temp.output();
cout<<"请输入你要删除的位置:";
cin>>i;
temp.Remove(i,dat);
temp.output();
cout<<"\n删除数据:"<<dat<<"成功!"<<endl;
cout<<"请输入你要搜索的数据:";
cin>>dat;
i=temp.Search(dat);
if(i)cout<<"\n搜索成功!数据位于下标:"<<i-1<<endl;
else cout<<"\n数据不存在!"<<endl;
}
template <class T>
class LinearList{
public:
LinearList() {}//或者直接删除
virtual ~LinearList() {}//或者直接删除,虚化为了继承调用
virtual int Size() const=0; //求表最大的容量
virtual int Length() const=0; //求表长度
virtual int Search(T x) const=0; //在表中搜索给定值x
virtual T* getData(int i) const=0; //取第i个元素
virtual void setData(int i,T x)=0; //修改第i个元素的值为x
virtual int Insert(int i,T x)=0; //在第i个表项后插入x
virtual int Remove(int i,T& x)=0; //删除第i个表项,通过x返回
virtual int IsEmpty() const=0; //判断表空
virtual int IsFull() const=0; //判断表满
virtual void input()=0; //输入表项
virtual void output()=0 ; //输出表项
};