C++實現順序表的14種操作


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM