类实现代码如下:
1 const int defaultSize=100;//默认的表空间大小 2 template <class T> 3 class SeqList{ 4 protected: 5 T *data;//存放数组 6 int maxSize;//表空间总大小 7 int last;//当前表中最后一个元素的位置(从0开始计算) 8 void reSize(int newSize);//重新设定表空间大小 9 public: 10 SeqList(int sz=defaultSize){//构造函数 11 maxSize=sz; 12 last=-1; 13 data=new T[sz]; 14 if(data==NULL) exit(1); 15 } 16 SeqList(SeqList<T>& L){//拷贝构造函数 17 maxSize=L.size(); 18 last=L.length()-1; 19 data=new T[maxSize]; 20 if(data==NULL) exit(1); 21 T value; 22 for(int i=0;i<=last;i++){ 23 L.getData(i+1,value); 24 data[i]=value; 25 } 26 27 } 28 ~SeqList(){//析构函数 29 delete[] data; 30 } 31 int size()const{//表空间总大小 32 return maxSize; 33 } 34 int length()const{//表中元素的总个数 35 return last+1; 36 } 37 int search(T &x)const{//返回元素X在表中的位置(从1开始计算) 38 for(int i=0;i<=last;i++){ 39 if(data[i]==x) return i+1; 40 } 41 return 0; 42 } 43 bool getData(int i,T &x)const{//取第i个表项的值放到x中(从1开始计算) 44 if(i>0&&i<=last+1){ 45 x=data[i-1]; 46 return true; 47 }else{ 48 return false; 49 } 50 } 51 void setData(int i,T &x){//将x中的值放到第i个表项中 (从1开始计算) 52 if(i>0&&i<=last+1){ 53 data[i-1]=x; 54 } 55 } 56 bool insert(int i,T& x){//插入x在第i个表项后 (从1开始计算) 57 if(last==maxSize-1) return false; 58 if(i<0||i>last+1) return false; 59 for(int j=last;j>=i;j--) 60 data[j+1]=data[j]; 61 data[i]=x; 62 last++; 63 return true; 64 } 65 bool remove(int i,T &x){//删除第i个表项值,并放入x (从1开始计算) 66 if(last==-1) return false; 67 if(i<1||i>last+1) return false; 68 x=data[i-1]; 69 for(int j=i;j<=last;j++) 70 data[j-1]=data[j]; 71 last--; 72 return true; 73 } 74 bool isFull(){//判断表是否为空 75 return (last==maxSize-1)?true:false; 76 } 77 bool isEmpty(){//判断表是否为满 78 return (last==-1)?true:false; 79 } 80 void input(){//输入 81 while(true){ 82 cout<<"请先输入你需要输入表中元素的个数:(不能超过"<<maxSize<<")"; 83 cin>>last; 84 last--; 85 if(last<=maxSize-1) break; 86 } 87 cout<<"输入元素:"<<endl; 88 for(int i=0;i<=last;i++) 89 cin>>data[i]; 90 } 91 void output(){//输出 92 cout<<"输出元素:"<<endl; 93 for(int i=0;i<=last;i++) 94 cout<<data[i]<<" "; 95 cout<<endl; 96 } 97 //SeqList<T> operator=(SeqList<T> &L);“=”重载,功能、函数实现同拷贝构造函数 98 99 };
测试代码如下:
1 void menu(){ 2 cout<<"1.输入一组元素"<<endl; 3 cout<<"2.输出一组元素"<<endl; 4 cout<<"3.取第i个表项的值放到x中(从1开始计算) "<<endl; 5 cout<<"4.将x中的值放到第i个表项中 (从1开始计算) "<<endl; 6 cout<<"5.插入x在第i个表项后 (从1开始计算) "<<endl; 7 cout<<"6.删除第i个表项值,并放入x (从1开始计算)"<<endl; 8 cout<<"7.返回元素X在表中的位置(从1开始计算)"<<endl; 9 cout<<"8.调用拷贝构造函数"<<endl; 10 cout<<"9.退出"<<endl; 11 } 12 13 template <class T> 14 void function(int num,SeqList<T> *sl){ 15 int i;T x; 16 switch(num){ 17 case 1: 18 sl->input(); 19 break; 20 case 2: 21 sl->output(); 22 break; 23 case 3: 24 cin>>i; 25 sl->getData(i,x); 26 cout<<x<<endl; 27 break; 28 case 4: 29 cin>>x>>i; 30 sl->setData(i,x); 31 break; 32 case 5: 33 cin>>x>>i; 34 sl->insert(i,x); 35 break; 36 case 6: 37 cin>>i; 38 sl->remove(i,x); 39 break; 40 case 7: 41 cin>>x; 42 i=sl->search(x); 43 cout<<i<<endl; 44 break; 45 case 8: 46 { 47 SeqList<T> *sl2=new SeqList<T>(*sl); 48 sl2->output(); 49 // sl->remove(2,x); 50 // sl2->output(); 51 delete sl2; 52 }//这里要用花括号!http://www.cnblogs.com/RealOnlyme/articles/2579628.html 53 break; 54 default: 55 exit(0); 56 } 57 } 58 int main(int argc, char** argv) { 59 int x; 60 SeqList<int> *sl=new SeqList<int>(); 61 while(true){ 62 menu(); 63 cin>>x; 64 function(x,sl); 65 } 66 delete sl; 67 return 0; 68 }
小结:
1.顺序表中各个元素必须相继存放于一个连续的空间内,不准跳跃地存放。(与一维数组的区别)
2.顺序表中最复杂的操作就是搜索,插入和删除运算。
3.分析搜索的时间代价主要看循环内数据的比较次数,次数从1到n,平均比较(n+1)/2个表项。
4.分析插入删除的时间代价主要看循环内的数据移动次数。插入时有n+1个插入位置,移动次数从0到n,平均移动n/2个表项;删除时有n个删除位置,移动次数从0到n-1,平均移动(n-1)/2个表项。
时间: 2024-10-05 05:05:46