顺序表应该是数据结构中最简单的一项,不和大佬们比划,我写在这里只是自娱自乐,希望有错误不要笑话我,但希望大佬给我提出来。
定义一个基类:
//
// 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; } }