C++顺序表
1 #include<iostream>
2
3 using namespace std;
4
5 int maxSize = 100;
6
7 // 定义
8 template <class T>
9 class SqListClass
10 {
11 private:
12 T *data; // 存放顺序表中的元素
13 int length; // 存放顺序表的长度
14
15 public:
16 SqListClass(); // 构造函数
17 ~SqListClass(); // 析构函数
18 void CreateList(T a[], int n); // 由a数组中的元素建造顺序表
19 void DispList(); // 输出顺序表L中的所有元素
20 int ListLength(); // 求顺序表的长度
21 bool GetElem(int i, T &e); // 求顺序表中某序列号的元素值
22 int LocateElem(T e); // 按元素查找其第一个序号位置
23 bool ListInsert(int i, T e); // 在位置i插入数据元素e
24 bool ListDelete(int i); // 在位置i删除数据元素
25 void ReverseList(SqListClass<T> &L); // 翻转顺序表
26 };
27
28 // 线性表的初始化
29 template<class T>
30 SqListClass<T>::SqListClass() // 构造函数
31 {
32 data = new T[maxSize];
33 length = 0;
34 }
35
36 // 线性表的销毁
37 template<class T>
38 SqListClass<T>::~SqListClass() // 析构函数
39 {
40 delete [] data;
41 }
42
43 // 实现
44
45 // 线性表的创建,时间复杂度为O(n)
46 template<class T>
47 void SqListClass<T>::CreateList(T a[], int n)
48 {
49 int i;
50 for(i=0; i<n; i++){
51 data[i] = a[i];
52 }
53 length = i;
54 }
55
56 // 输出线性表的所有元素,时间复杂度为O(n)
57 template<class T>
58 void SqListClass<T>::DispList(){
59 cout << "Out:" << endl;
60 for(int i=0; i<length; i++){
61 cout << data[i] << " ";
62 }
63 cout << endl;
64 }
65
66 // 求线性表的长度,时间复杂度为O(1)
67 template<class T>
68 int SqListClass<T>::ListLength(){
69 return length;
70 }
71
72 // 求顺序表中某序列号的元素值,,时间复杂度为O(1)
73 template<class T>
74 bool SqListClass<T>::GetElem(int i, T &e){
75 if(i<0 || i>length) return false;
76 e = data[i-1];
77 return true;
78 }
79
80 // 按元素查找其第一个序号位置,时间复杂度为O(n)
81 template<class T>
82 int SqListClass<T>::LocateElem(T e){
83 int i = 0;
84 while(i<length && data[i]!=e) i++;
85 if(i>=length) return 0;
86 else return i+1;
87 }
88
89 // 在位置i插入数据元素e,时间复杂度为O(n)
90 template<class T>
91 bool SqListClass<T>::ListInsert(int i, T e){
92 if(i<0 || i>length) return false;
93 for(int j=length; j>=i; j--){
94 data[j]=data[j-1];
95 }
96 data[i-1] = e;
97 length++;
98 return true;
99 }
100
101 // 在位置i删除数据元素,时间复杂度为O(n)
102 template<class T>
103 bool SqListClass<T>::ListDelete(int i){
104 if(i<0 || i>length) return false;
105 for(int j=i-1; j< length; j++){
106 data[j] = data[j+1];
107 }
108 length--;
109 return true;
110 }
111
112 // 翻转顺序表
113 template<class T>
114 void SqListClass<T>::ReverseList(SqListClass<T> &L){
115 T temp;
116 for(int j=0; j<L.length/2; j++){
117 temp = L.data[j];
118 L.data[j] = L.data[length-j-1];
119 L.data[length-j-1] = temp;
120 }
121 }
122
123 // 主函数
124 int main(){
125 SqListClass<int> sqList;
126 int arr[3] = {3,4,5};
127 // 创建线性表
128 sqList.CreateList(arr, 3);
129 // 输出线性表
130 sqList.DispList();
131 // 输出线性表的长度
132 cout << "sqList length is " << sqList.ListLength() << endl;
133 // 求第二个位置的元素
134 int a;
135 sqList.GetElem(2, a);
136 cout <<"The 2 local is elem " << a << endl;
137 // 查找元素5的位置
138 cout << "The elem 5 local is " << sqList.LocateElem(5) << endl;
139 // 在位置4插入元素6
140 sqList.ListInsert(2, 6);
141 sqList.DispList();
142 // 在位置1删除数据元素
143 sqList.ListDelete(1);
144 sqList.DispList();
145 // 翻转顺序表
146 sqList.ReverseList(sqList);
147 sqList.DispList();
148 return 0;
149 }