【数据结构 Python & C++】顺序表
用C++ 和 Python实现顺序表的简单操作
C++代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // Date:2019.7.31 2 // Author:Yushow Jue 3 4 #include<iostream> 5 using namespace std; 6 7 #define MAXSIZE 3 8 #define Node ElemType 9 #define ERROR 0 10 typedef int DataType; 11 12 //创建一个节点类 13 class Node 14 { 15 public: 16 DataType data; 17 }; 18 19 //创建一个顺序表类 20 class SqList 21 { 22 public: 23 SqList(); //初始化顺序表 24 ~SqList(); //销毁顺序表 25 void CreateSqList(int n); //定义创建一个顺序表 26 void TraverseSqList(); //遍历顺序表 27 ElemType GetElemByIndex(int i); //根据下标查找顺序表中的元素 28 bool isEmpty(); //判断顺序表是否为空 29 bool isFull(); //判断顺序表是否满 30 int GetLength(); //获取顺序表的长度 31 int GetElemByElem(DataType data); //查看顺序表中是否含有查找的值 32 void InsertSqList(int n, DataType data); //向顺序表中插入新数据 33 void InsertSqListAtHead(DataType data); //在头部插入新数据 34 void InsertSqListAtEnd(DataType data); //向顺序表的最后插入数据 35 void DeleteElem(int i); //删除指定位置的值 36 void DeleteElemAtElem(DataType data);//按值删除元素 37 void DeleteAll(); //删除所有元素 38 void DeleteAtHead(); //在头部删除元素 39 private: 40 Node* elem; //顺序表的基地址 41 int length; //顺序表的长度 42 }; 43 44 //初始化顺序表 45 SqList::SqList() 46 { 47 elem = new ElemType[MAXSIZE]; //开辟空间 48 if (!elem) { //当溢出时报异常 49 exit(OVERFLOW); 50 } 51 length = 0; //定义顺序表的长度 52 } 53 54 //销毁顺序表 55 SqList::~SqList() 56 { 57 delete[] elem; //删除基地址的指针 58 } 59 60 //创建顺序表 61 void SqList::CreateSqList(int n) 62 { 63 if (n < 0) { //当输入的数值有误时报异常 64 cout << "输入的节点个数有误!" << endl; 65 exit(EXIT_FAILURE); 66 } 67 else { 68 int i; 69 for (i = 0; i < n; i++) { //循环向数组中插入数据 70 cout << "请输入第" << i + 1 << "个节点元素: "; 71 cin >> elem[i].data; 72 } 73 length = n; //更改顺序表的长度 74 } 75 } 76 77 //遍历顺序表 78 void SqList::TraverseSqList() 79 { 80 for (int i = 0; i < length; i++) { //循环打印顺序表的每个节点数据 81 cout << "第" << i + 1 << "个元素的值是" << elem[i].data << endl; 82 } 83 } 84 85 //通过下标获取元素 86 ElemType SqList::GetElemByIndex(int i) 87 { 88 if (i < 1 || i > length) { //下标输入有误时报异常 89 cout << "查询的下标不存在" << endl; 90 } 91 else { 92 return elem[i - 1]; //返回下标指定的节点 93 } 94 } 95 96 //判断顺序表是否为空 97 bool SqList::isEmpty() 98 { 99 if (length == 0) //如果顺序表的长度为0,则表为空 100 return true; 101 return false; //长度不为0,表不为空 102 } 103 104 //判断顺序表是否满 105 bool SqList::isFull() 106 { 107 if (length == MAXSIZE) //当长度为定义的最大长度,则顺序表满 108 return true; 109 return false; //否则不满 110 } 111 112 //获取顺序表的长度 113 int SqList::GetLength() 114 { 115 return length; //返回顺序表的长度 116 } 117 118 //判断是否存在寻找的值,如果存在将返回下标 119 int SqList::GetElemByElem(DataType data) 120 { 121 int i; 122 for (i = 0; i < length; i++) { //从头遍历顺序表 123 if (elem && elem[i].data == data) { //若找到与之匹配的数据,则返回当前节点的下标 124 return i + 1; 125 } 126 if (i == length - 1) { //否则返回-1 127 return -1; 128 } 129 130 } 131 } 132 133 //插入一个数据 134 void SqList::InsertSqList(int i, DataType data) 135 { 136 if (i<1 || i > length + 1) { //下标输入有误时报异常 137 cout << "输入的下标不合法" << endl; 138 } 139 else if (length > MAXSIZE) { //当顺序表满时无法插入新的数据 140 cout << "已经达到最大长度" << endl; 141 } 142 else 143 { 144 for (int j = length - 1; j >= i - 1; j--) { //遍历到要插入的位置 145 elem[j + 1] = elem[j]; //从j位置后的全体数据向后移一位 146 } 147 elem[i - 1].data = data; //插入数据 148 length++; //更改顺序表长度 149 } 150 } 151 152 //在头部插入一个新数据 153 void SqList::InsertSqListAtHead(DataType data) 154 { 155 156 for (int i = length - 1; i >= 0; i--) //将全体元素向后移一位 157 { 158 elem[i + 1] = elem[i]; 159 } 160 elem[0].data = data; //在第一个位置插入元素 161 length++; //更改长度 162 } 163 164 //在顺序表的最后插入数据 165 void SqList::InsertSqListAtEnd(DataType data) 166 { 167 if (length > MAXSIZE) { //当顺序表满时无法插入新的数据 168 cout << "已经达到最大长度" << endl; 169 } 170 else 171 { 172 elem[length].data = data; //插入数据 173 length++; //更改顺序表长度 174 } 175 } 176 177 //根据下标删除一个节点 178 void SqList::DeleteElem(int i) 179 { 180 int j; 181 if (i<1 || i>length) //输入的位置不合法报异常 182 cout << "输入的下标不合法" << endl; 183 else 184 { 185 for (j = i; j <= length - 1; j++) { //循环到要删除节点的位置 186 elem[j - 1] = elem[j]; //该位置后的元素全体向前移一个位置 187 } 188 length--; //更改顺序表长度 189 } 190 } 191 192 //按值删除元素 193 void SqList::DeleteElemAtElem(DataType data) 194 { 195 int i = 0; 196 while (elem[i].data == data && i < length) //按值查到要删除数据的位置 197 { 198 i++; 199 } 200 for (int index = i; index <= length - 1; index++) //将该位置后的节点全体向前移一位 201 { 202 elem[index - 1] = elem[index]; 203 } 204 length--; //更改顺序表长度 205 } 206 207 //删除所有元素 208 void SqList::DeleteAll() 209 { 210 for (int i = length; i > 0; i--) //从最后一个元素开始删除,长度减一 211 { 212 elem[i] = elem[i - 1]; //元素向前移位 213 length--; //长度减一 214 } 215 } 216 217 //在头部删除元素 218 void SqList::DeleteAtHead() 219 { 220 for (int i = 1; i <= length - 1; i++) { 221 elem[i - 1] = elem[i]; 222 } 223 length--; 224 } 225 226 //测试函数 227 int main() 228 { 229 SqList l; 230 int i; 231 cout << "1.创建一个顺序表 2.遍历顺序表 3.通过下标获取元素\n4.查找要查询的元素的下标 5.通过下标插入元素 6.通过下标删除一个元素\n7.获取顺序表的长度 8.删除所有元素 9.判断顺序表是否为空\n10.判断顺序表是否满 11.根据数据删除节点 12.在头部插入数据\n13.在头部删除数据 14.在顺序表最后插入数据 0.退出" << endl; 232 do 233 { 234 cout << "请选择一个操作: "; 235 cin >> i; 236 switch (i) 237 { 238 case 1: 239 int n; 240 cout << "请输入顺序表的元素个数: "; 241 cin >> n; 242 l.CreateSqList(n); 243 break; 244 case 2: 245 l.TraverseSqList(); 246 break; 247 case 3: 248 int i; 249 cout << "请输入将要获取元素的下标: "; 250 cin >> i; 251 ElemType getElemByIndex = l.GetElemByIndex(i); 252 cout << getElemByIndex.data << endl; 253 break; 254 case 4: 255 DataType data; 256 cout << "请输入将要查找元素的值: "; 257 cin >> data; 258 cout << "该元素的下标为:" << l.GetElemByElem(data) << endl; 259 break; 260 case 5: 261 int index; 262 DataType insertData; 263 cout << "请输入要插入的数据的位置: "; 264 cin >> index; 265 cout << "请输入要插入的数据: "; 266 cin >> insertData; 267 l.InsertSqList(index, insertData); 268 break; 269 case 6: 270 int deleteIndex; 271 cout << "请输入要删除的数据的下标: "; 272 cin >> deleteIndex; 273 l.DeleteElem(deleteIndex); 274 break; 275 case 7: 276 cout << l.GetLength() << endl; 277 break; 278 case 8: 279 l.DeleteAll(); 280 break; 281 case 9: 282 if (l.isEmpty() == 1) { 283 cout << "顺序表为空" << endl; 284 } 285 else 286 { 287 cout << "顺序表不为空" << endl; 288 } 289 break; 290 case 10: 291 if (l.isFull() == 1) { 292 cout << "顺序表满" << endl; 293 } 294 else 295 { 296 cout << "顺序表不满" << endl; 297 } 298 break; 299 case 11: 300 DataType data1; 301 cout << "请输入要删除的数据: "; 302 cin >> data1; 303 l.DeleteElemAtElem(data1); 304 break; 305 case 12: 306 DataType data2; 307 cout << "请输入要在头部插入的数据: "; 308 cin >> data2; 309 l.InsertSqListAtHead(data2); 310 break; 311 case 13: 312 l.DeleteAtHead(); 313 break; 314 case 14: 315 DataType data3; 316 cout << "请输入要在末尾插入的数据: "; 317 cin >> data3; 318 l.InsertSqListAtEnd(data3); 319 break; 320 default: 321 break; 322 } 323 } while (i != 0); 324 system("pause"); 325 return 0; 326 }
Python代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class SqList(object): def __init__(self, size=6): self.max = size self.length = 0 self.list = [] # 创建顺序表 def create_list(self, ): self.length = int(input("请输入顺序表长度")) while self.length > self.max: print("超出最大范围6,重新输入。") self.length = int(input("请输入顺序表长度")) i = 0 while i < self.length: temp = input("请输入第%s个元素" % i) try: temp = float(temp) self.list.append(temp) i += 1 except ValueError: print("wrong value !") # 遍历 def print_list(self): print(self.list) # 判空 def is_empty(self): if self.length == 0: print("顺序表为空") # 判满 def is_full(self): if self.length == self.max: return True # 根据下标索引 def get_elem_by_index(self, index): if index >= self.length: print("下标超出范围") else: print("第%s个元素为:%s" % (index, self.list[index])) # 按值查找 def get_elem_by_elem(self, value): for i in range(self.length): if value == self.list[i]: return i return -1 # 插入 def insert(self, index, value): if not isinstance(index, int): raise TypeError elif index < 0 or index > self.length: raise IndexError else: self.list.append(0) for i in range(self.length, index, -1): self.list[i] = self.list[i-1] self.list[index] = value self.length += 1 # 按值删除 def delete_elem(self, index): for i in range(index, self.length): self.list[index] = self.list[index+1] self.list.pop() self.length -= 1 # 清空顺序表 def clear(self): self.list.clear() if __name__ == '__main__': sq_list = SqList() sq_list.create_list() sq_list.print_list() if sq_list.is_full(): print("顺序表满了") print("操作码:") print("1:插入 2:按值查找 3:按值删除 4:清空 0:退出") op = 1 while op != 0: op = int(input("请输入操作码:")) if op == 1: if sq_list.is_full(): print("顺序表已满,无法插入") else: input_index = int(input("插入位置")) input_value = float(input("插入元素")) sq_list.insert(input_index, input_value) sq_list.print_list() elif op == 2: input_value = float(input("元素值")) num = sq_list.get_elem_by_elem(input_value) if num != -1: print("存在元素%s,下标为%s" % (input_value, num)) else: print("不存在") elif op == 3: input_value = float(input("元素值")) num = sq_list.get_elem_by_elem(input_value) sq_list.delete_elem(num) sq_list.print_list() elif op == 4: sq_list.clear() print("清空顺序表") sq_list.print_list() else: break