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 }

 

posted @ 2017-12-27 23:52  kgvito  阅读(5685)  评论(0编辑  收藏  举报