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 }