顺序表的实现
1 #include<iostream> 2 using namespace std; 3 #include<cassert> 4 typedef int DataType; 5 6 class SeqList 7 { 8 public: 9 SeqList() 10 : _array(NULL) 11 , _size(0) 12 , _capacity(0) 13 { 14 cout << "SeqList()" << endl; 15 } 16 SeqList(DataType* a, size_t size) 17 : _array(new DataType[size]) 18 , _size(size) 19 , _capacity(size) 20 { 21 cout << "SeqList()" << endl; 22 memcpy(_array, a, sizeof(DataType)*size); 23 } 24 ~SeqList() 25 { 26 if (_array) 27 { 28 delete[] _array; 29 _array = NULL; 30 _size = 0; 31 _capacity = 0; 32 } 33 cout << "~SeqList()" << endl; 34 } 35 /*SeqList(const SeqList &s) 36 { 37 _array = new DataType[s._size]; 38 memcpy(_array, s._array, sizeof(DataType)*s._size); 39 _size = s._size; 40 _capacity = s._capacity; 41 }*/ 42 SeqList(const SeqList &s) 43 :_array(NULL) 44 , _size(0) 45 , _capacity(0) 46 { 47 SeqList tmp (s._array,s._size); 48 tmp.Swap(*this); 49 } 50 void Swap(SeqList &s) 51 { 52 std::swap(_array, s._array); 53 std::swap(_size, s._size); 54 std::swap(_capacity, s._capacity); 55 } 56 SeqList& operator=(const SeqList &s) 57 { 58 if (this != &s) 59 { 60 delete[] _array; 61 _array = new DataType[s._size]; 62 _size = s._size; 63 _capacity = s._capacity; 64 } 65 return *this; 66 } 67 public: 68 void PushBack(DataType x) 69 { 70 _CheckCapacity(_size); 71 _array[_size] = x; 72 _size++; 73 } 74 75 void PushFront(DataType x) 76 { 77 _CheckCapacity(_size); 78 for (size_t i = _size; i >0; --i) 79 { 80 _array[i] = _array[i - 1]; 81 } 82 _array[0] = x; 83 _size++; 84 } 85 86 void Insert(DataType x, size_t Pos) 87 { 88 _CheckCapacity(_size); 89 if (Pos <= 0 || Pos>_size) 90 { 91 cout << "插入位置不合法" << endl; 92 } 93 else 94 { 95 for (size_t i = _size; i > Pos; --i) 96 { 97 _array[i] = _array[i-1]; 98 } 99 _array[Pos] = x; 100 ++_size; 101 } 102 } 103 104 void PopFront() 105 { 106 assert(_array); 107 if (_size <= 0) 108 { 109 cout << "顺序表为空。" << endl; 110 } 111 else 112 { 113 for (size_t i = 1; i <_size; ++i) 114 { 115 _array[i - 1] = _array[i]; 116 } 117 _size--; 118 } 119 120 } 121 122 void PopBack() 123 { 124 assert(_array); 125 if (_size <= 0) 126 { 127 cout << "顺序表为空。" << endl; 128 } 129 else 130 { 131 _size--; 132 } 133 134 } 135 136 void Erase(size_t Pos) 137 { 138 assert(_array); 139 if (_size <= 0) 140 { 141 cout << "顺序表为空。" << endl; 142 } 143 else if (Pos <= 0 || Pos>_size) 144 { 145 cout << "指定位置不合法" << endl; 146 } 147 else 148 { 149 for (size_t i = Pos; i < _size-1; ++i) 150 { 151 _array[i] = _array[i + 1]; 152 } 153 _size--; 154 } 155 } 156 157 int Find(const DataType& x) 158 { 159 assert(_array); 160 size_t result=0; 161 for (size_t i = 0; i < _size; i++) 162 { 163 if (_array[i] == x) 164 { 165 result = i; 166 break; 167 } 168 else 169 { 170 result = -1; 171 } 172 } 173 if (result == -1) 174 { 175 cout << "顺序表中没有要查找的数据。" << endl; 176 } 177 return result; 178 179 } 180 181 void Print() 182 { 183 for (size_t i = 0; i < _size; i++) 184 { 185 cout << _array[i] << " "; 186 } 187 cout << endl; 188 } 189 190 private: 191 void _CheckCapacity(size_t size) 192 { 193 if (size >= _capacity) 194 { 195 _capacity = size > _size * 2 ? size : _capacity * 2; 196 DataType* tmp = new DataType[_capacity]; 197 memcpy(tmp, _array, sizeof(DataType)*_size); 198 delete[] _array; 199 _array = tmp; 200 } 201 } 202 private: 203 DataType* _array; 204 size_t _size; 205 size_t _capacity; 206 }; 207 208 void Test1() 209 { 210 int array[5] = { 0, 1, 2, 3, 4 }; 211 SeqList s1(array, 5); 212 cout << "原顺序表:" << endl; 213 s1.Print(); 214 cout << "PushBack:" << endl; 215 s1.PushBack(5); 216 s1.PushBack(6); 217 s1.PushBack(7); 218 s1.PushBack(8); 219 s1.PushBack(9); 220 s1.PushBack(10); 221 222 223 s1.Print(); 224 225 cout << "PushFront(5):" << endl; 226 s1.PushFront(5); 227 s1.Print(); 228 229 cout << "Insert(5,2):" << endl; 230 s1.Insert(5,2); 231 s1.Print(); 232 233 } 234 235 void Test2() 236 { 237 int array[5] = { 0, 1, 2, 3, 4 }; 238 SeqList s2(array, 5); 239 cout << "原顺序表:" << endl; 240 s2.Print(); 241 cout << "PopFront():" << endl; 242 s2.PopFront(); 243 s2.PopFront(); 244 //s2.PopFront(); 245 s2.Print(); 246 247 cout << "PopBack():" << endl; 248 s2.PopBack(); 249 s2.PopBack(); 250 //s2.PopBack(); 251 //s2.PopBack(); 252 s2.Print(); 253 254 cout << "Erase(2):" << endl; 255 s2.Erase(2); 256 s2.Print(); 257 } 258 259 void Test3() 260 { 261 int array[5] = { 8, 3, 4, 6, 5 }; 262 SeqList s3(array, 5); 263 cout << "原顺序表:" << endl; 264 s3.Print(); 265 266 cout << "查找3所对应的位置:" << s3.Find(3) << endl; 267 cout << "查找9所对应的位置:" << s3.Find(9) << endl; 268 269 } 270 int main() 271 { 272 Test1(); 273 Test2(); 274 Test3(); 275 return 0; 276 }