C++順序表的操作
2017-12-27
1 // 順序表.cpp: 定義控制台應用程序的入口點。 2 //Author:kgvito YinZongYao 3 //Date: 2017.12.27 4 5 #include "stdafx.h" 6 #include<iostream> 7 using namespace std; 8 9 #define MAXSIZE 3 10 #define Node ElemType 11 #define ERROR 0 12 typedef int DataType; 13 14 //創建一個節點類 15 class Node 16 { 17 public: 18 DataType data; 19 }; 20 21 //創建一個順序表類 22 class SqList 23 { 24 public: 25 SqList(); //初始化順序表 26 ~SqList(); //銷毀順序表 27 void CreateSqList(int n); //定義創建一個順序表 28 void TraverseSqList(); //遍歷順序表 29 ElemType GetElemByIndex(int i); //根據下標查找順序表中的元素 30 bool isEmpty(); //判斷順序表是否為空 31 bool isFull(); //判斷順序表是否滿 32 int GetLength(); //獲取順序表的長度 33 int GetElemByElem(DataType data); //查看順序表中是否含有查找的值 34 void InsertSqList(int n, DataType data); //向順序表中插入新數據 35 void InsertSqListAtHead(DataType data); //在頭部插入新數據 36 void InsertSqListAtEnd(DataType data); //向順序表的最后插入數據 37 void DeleteElem(int i); //刪除指定位置的值 38 void DeleteElemAtElem(DataType data);//按值刪除元素 39 void DeleteAll(); //刪除所有元素 40 void DeleteAtHead(); //在頭部刪除元素 41 private: 42 Node * elem; //順序表的基地址 43 int length; //順序表的長度 44 }; 45 46 //初始化順序表 47 SqList::SqList() 48 { 49 elem = new ElemType[MAXSIZE]; //開辟空間 50 if (!elem) { //當溢出時報異常 51 exit(OVERFLOW); 52 } 53 length = 0; //定義順序表的長度 54 } 55 56 //銷毀順序表 57 SqList::~SqList() 58 { 59 delete[] elem; //刪除基地址的指針 60 } 61 62 //創建順序表 63 void SqList::CreateSqList(int n) 64 { 65 if (n < 0) { //當輸入的數值有誤時報異常 66 cout << "輸入的節點個數有誤!" << endl; 67 exit(EXIT_FAILURE); 68 } 69 else { 70 int i; 71 for (i = 0; i < n;i++) { //循環向數組中插入數據 72 cout << "請輸入第" << i + 1 << "個節點元素: "; 73 cin>>elem[i].data; 74 } 75 length = n; //更改順序表的長度 76 } 77 } 78 79 //遍歷順序表 80 void SqList::TraverseSqList() 81 { 82 for (int i = 0; i < length;i++) { //循環打印順序表的每個節點數據 83 cout << "第" << i + 1 << "個元素的值是" << elem[i].data << endl; 84 } 85 } 86 87 //通過下標獲取元素 88 ElemType SqList::GetElemByIndex(int i) 89 { 90 if (i < 1 || i > length) { //下標輸入有誤時報異常 91 cout << "查詢的下標不存在" << endl; 92 } 93 else { 94 return elem[i - 1]; //返回下標指定的節點 95 } 96 } 97 98 //判斷順序表是否為空 99 bool SqList::isEmpty() 100 { 101 if (length == 0) //如果順序表的長度為0,則表為空 102 return true; 103 return false; //長度不為0,表不為空 104 } 105 106 //判斷順序表是否滿 107 bool SqList::isFull() 108 { 109 if (length == MAXSIZE) //當長度為定義的最大長度,則順序表滿 110 return true; 111 return false; //否則不滿 112 } 113 114 //獲取順序表的長度 115 int SqList::GetLength() 116 { 117 return length; //返回順序表的長度 118 } 119 120 //判斷是否存在尋找的值,如果存在將返回下標 121 int SqList::GetElemByElem(DataType data) 122 { 123 int i; 124 for (i = 0; i < length;i++) { //從頭遍歷順序表 125 if (elem && elem[i].data == data) { //若找到與之匹配的數據,則返回當前節點的下標 126 return i + 1; 127 } 128 if (i == length - 1) { //否則返回-1 129 return -1; 130 } 131 132 } 133 } 134 135 //插入一個數據 136 void SqList::InsertSqList(int i, DataType data) 137 { 138 if (i<1 || i > length+1) { //下標輸入有誤時報異常 139 cout << "輸入的下標不合法" << endl; 140 } 141 else if (length > MAXSIZE) { //當順序表滿時無法插入新的數據 142 cout << "已經達到最大長度" << endl; 143 } 144 else 145 { 146 for (int j = length - 1; j >= i - 1; j--) { //遍歷到要插入的位置 147 elem[j + 1] = elem[j]; //從j位置后的全體數據向后移一位 148 } 149 elem[i - 1].data = data; //插入數據 150 length++; //更改順序表長度 151 } 152 } 153 154 //在頭部插入一個新數據 155 void SqList::InsertSqListAtHead(DataType data) 156 { 157 158 for (int i = length - 1; i >= 0; i--) //將全體元素向后移一位 159 { 160 elem[i + 1] = elem[i]; 161 } 162 elem[0].data = data; //在第一個位置插入元素 163 length++; //更改長度 164 } 165 166 //在順序表的最后插入數據 167 void SqList::InsertSqListAtEnd(DataType data) 168 { 169 if (length > MAXSIZE) { //當順序表滿時無法插入新的數據 170 cout << "已經達到最大長度" << endl; 171 } 172 else 173 { 174 elem[length].data = data; //插入數據 175 length++; //更改順序表長度 176 } 177 } 178 179 //根據下標刪除一個節點 180 void SqList::DeleteElem(int i) 181 { 182 int j; 183 if (i<1 || i>length) //輸入的位置不合法報異常 184 cout << "輸入的下標不合法" << endl; 185 else 186 { 187 for (j = i; j <= length - 1;j++) { //循環到要刪除節點的位置 188 elem[j - 1] = elem[j]; //該位置后的元素全體向前移一個位置 189 } 190 length--; //更改順序表長度 191 } 192 } 193 194 //按值刪除元素 195 void SqList::DeleteElemAtElem(DataType data) 196 { 197 int i = 0; 198 while (elem[i].data == data && i < length) //按值查到要刪除數據的位置 199 { 200 i++; 201 } 202 for (int index = i; index <= length - 1; index++) //將該位置后的節點全體向前移一位 203 { 204 elem[index - 1] = elem[index]; 205 } 206 length--; //更改順序表長度 207 } 208 209 //刪除所有元素 210 void SqList::DeleteAll() 211 { 212 for (int i = length;i > 0;i--) //從最后一個元素開始刪除,長度減一 213 { 214 elem[i] = elem[i - 1]; //元素向前移位 215 length--; //長度減一 216 } 217 } 218 219 //在頭部刪除元素 220 void SqList::DeleteAtHead() 221 { 222 for (int i = 1; i <= length - 1; i++) { 223 elem[i - 1] = elem[i]; 224 } 225 length--; 226 } 227 228 //測試函數 229 int main() 230 { 231 SqList l; 232 int i; 233 cout << "1.創建一個順序表 2.遍歷順序表 3.通過下標獲取元素\n4.查找要查詢的元素的下標 5.通過下標插入元素 6.通過下標刪除一個元素\n7.獲取順序表的長度 8.刪除所有元素 9.判斷順序表是否為空\n10.判斷順序表是否滿 11.根據數據刪除節點 12.在頭部插入數據\n13.在頭部刪除數據 14.在順序表最后插入數據 0.退出" << endl; 234 do 235 { 236 cout << "請選擇一個操作: " ; 237 cin >> i; 238 switch (i) 239 { 240 case 1: 241 int n; 242 cout << "請輸入順序表的元素個數: "; 243 cin >> n; 244 l.CreateSqList(n); 245 break; 246 case 2: 247 l.TraverseSqList(); 248 break; 249 case 3: 250 int i; 251 cout << "請輸入將要獲取元素的下標: "; 252 cin >> i; 253 ElemType getElemByIndex = l.GetElemByIndex(i); 254 cout << getElemByIndex.data << endl; 255 break; 256 case 4: 257 DataType data; 258 cout << "請輸入將要查找元素的值: "; 259 cin >> data; 260 cout<<"該元素的下標為:"<<l.GetElemByElem(data)<<endl; 261 break; 262 case 5: 263 int index; 264 DataType insertData; 265 cout << "請輸入要插入的數據的位置: "; 266 cin >> index; 267 cout << "請輸入要插入的數據: "; 268 cin >> insertData; 269 l.InsertSqList(index, insertData); 270 break; 271 case 6: 272 int deleteIndex; 273 cout << "請輸入要刪除的數據的下標: "; 274 cin >> deleteIndex; 275 l.DeleteElem(deleteIndex); 276 break; 277 case 7: 278 cout<<l.GetLength()<<endl; 279 break; 280 case 8: 281 l.DeleteAll(); 282 break; 283 case 9: 284 if (l.isEmpty() == 1) { 285 cout << "順序表為空" << endl; 286 } 287 else 288 { 289 cout << "順序表不為空" << endl; 290 } 291 break; 292 case 10: 293 if (l.isFull() == 1) { 294 cout << "順序表滿" << endl; 295 } 296 else 297 { 298 cout << "順序表不滿" << endl; 299 } 300 break; 301 case 11: 302 DataType data1; 303 cout << "請輸入要刪除的數據: "; 304 cin >> data1; 305 l.DeleteElemAtElem(data1); 306 break; 307 case 12: 308 DataType data2; 309 cout << "請輸入要在頭部插入的數據: "; 310 cin >> data2; 311 l.InsertSqListAtHead(data2); 312 break; 313 case 13: 314 l.DeleteAtHead(); 315 break; 316 case 14: 317 DataType data3; 318 cout << "請輸入要在末尾插入的數據: "; 319 cin >> data3; 320 l.InsertSqListAtEnd(data3); 321 break; 322 default: 323 break; 324 } 325 } while(i != 0); 326 system("pause"); 327 return 0; 328 }