定义一个基类:
//
// Created by lenovo on 2018/4/19.
//
#ifndef UNTITLED_LINEARLIST_H
#define UNTITLED_LINEARLIST_H
//
// Created by lenovo on 2018/4/19.
//
#ifndef LINEARLIST_LINEARLIST_H
#define LINEARLIST_LINEARLIST_H
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 bool getdata(int i,T& x) const=0;//取表中第i个元素的值
virtual void setdata(int i,T& x) const=0;//修改第i个表项的值
virtual bool inseret(int i,T& x) const=0;//在表弟i项后插入值
virtual bool remove(int i,T& x) const=0;//删除表中第i项,以x来返回
virtual bool isempty() const=0;//判断空
virtual bool isfull() const=0;//判断满
virtual void sort()=0;//排序
virtual void inout()=0;//输入
virtual void output()=0;//输出
virtual linearlist<T> operator=(linearlist<T>& L)=0;//复制,重载
};
#endif //LINEARLIST_LINEARLIST_H
#endif //UNTITLED_LINEARLIST_H
然后继承下:
//
// Created by lenovo on 2018/4/19.
//
#ifndef UNTITLED_SEQLIST_H
#define UNTITLED_SEQLIST_H
#include <iostream>
#include <cstdlib>
#include "linearlist.h"
const int defaultsize=100;
template <class T>
class seqlist:public linearlist<T>{
protected:
T *data;//存放数组
int maxsize;//数组中元素的最大个数
int last;//当前已存表的最后位置(从0开始)
void resize(int newsize);//重新定义数组大小
public:
seqlist(int sa=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返回(返回该元素的位置)
int locate(int i)const;//定位dii个项
bool getdata(int i,T&x)//取第i个项的值,并自动检查是否成功
{if(i>0&&i<=last+1) {x=data[i-1];return true;} else return false;}
bool setdata(int i,T&x)//用x修改第i个项的值
{if(i>0&&i<=last+1) data[i-1]=x;}
bool insert(int i,T&x);//在第i个项后插入x,并返回是否插入成功
bool remove(int i,T&x);//删除第i个项,并返回是否删除成功
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);//重载运算符=,整体x赋值到前面的seqlist对象
};
#endif //UNTITLED_SEQLIST_H
最后小小实现下:
//
// Created by lenovo on 2018/4/19.
//
#include <iostream>
#include "seqlist.h"
using namespace std;
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;
T value;//作为中间值,其作用是检测是否取值成功
data=new T[maxsize];
if(data==NULL){
cerr<<"存储分配错误!"<<endl;
exit(1);
}
for (int i = 1; i <=last+1 ; i++) {
L.getdata(i,value);
data[i-1]=value;//再辞value将值转化给data
}
}
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*destptr=newarray;//目的数组首地址
while(n--)
*destptr++=*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>
bool 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--)//在i后面插入
data[j+1]=data[j];//将i后的全部后移一格
data[i]=x;
last++;
return true;
}
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-1)
break;
cout<<"表示元素不能超过"<<maxsize-1<<":";
}
for (int i = 0; i <=last ; i++) {
cin>>data[i];
cout<<i+1<<endl;
}
}
template <class T>
void 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) {
maxsize=L.size();
last=L.length()-1;
T value;
data=new T[maxsize];
if(data==NULL){
cerr<<"内存分配错误"<<endl;
exit(1);
}
for (int i = 1; i <= last+1; i++) {
L.getdata(i,value);
data[i-1]=value;
}
}