类实现代码如下:
;//默认的表空间大小 template <class T> class SeqList{ protected: T *data;//存放数组 int maxSize;//表空间总大小 int last;//当前表中最后一个元素的位置(从0开始计算) void reSize(int newSize);//重新设定表空间大小 public: SeqList(int sz=defaultSize){//构造函数 maxSize=sz; last=-; data=new T[sz]; ); } SeqList(SeqList<T>& L){//拷贝构造函数 maxSize=L.size(); last=L.length()-; data=new T[maxSize]; ); T value; ;i<=last;i++){ L.getData(i+,value); data[i]=value; } } ~SeqList(){//析构函数 delete[] data; } int size()const{//表空间总大小 return maxSize; } int length()const{//表中元素的总个数 ; } int search(T &x)const{//返回元素X在表中的位置(从1开始计算) ;i<=last;i++){ ; } ; } bool getData(int i,T &x)const{//取第i个表项的值放到x中(从1开始计算) &&i<=last+){ x=data[i-]; return true; }else{ return false; } } void setData(int i,T &x){//将x中的值放到第i个表项中 (从1开始计算) &&i<=last+){ data[i-]=x; } } bool insert(int i,T& x){//插入x在第i个表项后 (从1开始计算) ) return false; ||i>last+) return false; for(int j=last;j>=i;j--) data[j+]=data[j]; data[i]=x; last++; return true; } bool remove(int i,T &x){//删除第i个表项值,并放入x (从1开始计算) ) return false; ||i>last+) return false; x=data[i-]; for(int j=i;j<=last;j++) data[j-]=data[j]; last--; return true; } bool isFull(){//判断表是否为空 )?true:false; } bool isEmpty(){//判断表是否为满 )?true:false; } void input(){//输入 while(true){ cout<<"请先输入你需要输入表中元素的个数:(不能超过"<<maxSize<<")"; cin>>last; last--; ) break; } cout<<"输入元素:"<<endl; ;i<=last;i++) cin>>data[i]; } void output(){//输出 cout<<"输出元素:"<<endl; ;i<=last;i++) cout<<data[i]<<" "; cout<<endl; } //SeqList<T> operator=(SeqList<T> &L);“=”重载,功能、函数实现同拷贝构造函数 };
测试代码如下:
void menu(){ cout<<"1.输入一组元素"<<endl; cout<<"2.输出一组元素"<<endl; cout<<"3.取第i个表项的值放到x中(从1开始计算) "<<endl; cout<<"4.将x中的值放到第i个表项中 (从1开始计算) "<<endl; cout<<"5.插入x在第i个表项后 (从1开始计算) "<<endl; cout<<"6.删除第i个表项值,并放入x (从1开始计算)"<<endl; cout<<"7.返回元素X在表中的位置(从1开始计算)"<<endl; cout<<"8.调用拷贝构造函数"<<endl; cout<<"9.退出"<<endl; } template <class T> void function(int num,SeqList<T> *sl){ int i;T x; switch(num){ : sl->input(); break; : sl->output(); break; : cin>>i; sl->getData(i,x); cout<<x<<endl; break; : cin>>x>>i; sl->setData(i,x); break; : cin>>x>>i; sl->insert(i,x); break; : cin>>i; sl->remove(i,x); break; : cin>>x; i=sl->search(x); cout<<i<<endl; break; : { SeqList<T> *sl2=new SeqList<T>(*sl); sl2->output(); // sl->remove(2,x); // sl2->output(); delete sl2; }//这里要用花括号!http://www.cnblogs.com/RealOnlyme/articles/2579628.html break; default: exit(); } } int main(int argc, char** argv) { int x; SeqList<int> *sl=new SeqList<int>(); while(true){ menu(); cin>>x; function(x,sl); } delete sl; ; }
小结:
1.顺序表中各个元素必须相继存放于一个连续的空间内,不准跳跃地存放。(与一维数组的区别)
2.顺序表中最复杂的操作就是搜索,插入和删除运算。
3.分析搜索的时间代价主要看循环内数据的比较次数,次数从1到n,平均比较(n+1)/2个表项。
4.分析插入删除的时间代价主要看循环内的数据移动次数。插入时有n+1个插入位置,移动次数从0到n,平均移动n/2个表项;删除时有n个删除位置,移动次数从0到n-1,平均移动(n-1)/2个表项。