首页 > 代码库 > 顺序表(C++实现)

顺序表(C++实现)

类实现代码如下:

 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=http://www.mamicode.com/new T[sz];
14             if(data=http://www.mamicode.com/=NULL) exit(1); 
15         }
16         SeqList(SeqList<T>& L){//拷贝构造函数 
17             maxSize=L.size();
18             last=L.length()-1;
19             data=http://www.mamicode.com/new T[maxSize];
20             if(data=http://www.mamicode.com/=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个表项。

  

顺序表(C++实现)