1)实验性质:设计性实验
(2)实验要求:
- 编程实现顺序表的以下基本操作:建立顺序表,修改顺序表,插入顺序表,删除顺序表。
- 采用顺序表结构编程实现:两个集合的运算:交集/并集/差集。
(3)实验目的
通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,培养学生编写程序时,要考虑程序的强壮性,熟练掌握通过函数参数返回函数结果的办法。
(4)实验内容
编程实现顺序表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其编程一个完整的小软件。
(5)参考界面
(6)验收/测试用例
通过菜单调用各个操作,测试点:
- 没有初始化前进行其他操作,程序是否能控制住;
- 初始化一个顺序表;
- 插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1),正确插入4个数据(1,2)、(1,1)、(3,3);
- 显示顺序表中的数据,屏幕输出1, 2, 3;
- 判空,屏幕输出顺序表非空;
- 顺序表长度,屏幕输出3;
- 获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;
- 定位,输入:4, 输出:不存在,输入2,输出位置为2;
- 求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;
- 求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;
- 删除,要测位置在【1,3】范围之外的情况和之内的情况;
- 清空操作后再测长度;
- 销毁顺序表
-
#include <iostream> using namespace std; #define maxsize 1000 typedef struct{ int *elem; int length; }SqList; string InitList(SqList &L){ L.elem = new int[maxsize]; if (!L.elem) return "创建失败,请重新创建!"; L.length = 0; return "创建表 OK"; } void DestroyList(SqList &L){ if (L.elem != NULL) delete[] L.elem; L.length = 0; L.elem = NULL; } void ClearList(SqList &L){ L.length = 0; L.elem = new int[maxsize]; } int GetLength(SqList &L){ return L.length; } bool Getresult(SqList &L){ if(L.length == 0) return false; else{ return true; } } void CheckList(SqList &L,int local){ if (local>L.length || local <1) cout<<"查询位置不存在"<<endl; else cout<<"你查询位置的内容为"<<L.elem[local-1]<<endl; } void CheckListQ(SqList &L,int local){ if (local>L.length || local <2) cout<<"查询位置不存在"<<endl; else cout<<"你查询前驱的内容为"<<L.elem[local-2]<<endl; } void CheckListH(SqList &L,int local){ if (local>L.length - 1 || local <1) cout<<"查询位置不存在"<<endl; else cout<<"你查询后继的内容为"<<L.elem[local]<<endl; } bool ListInsert(SqList &L,int a,int b){ if (a<1||a>L.length+1) return false; if (L.length == maxsize) return false; for (int j = L.length-1;j>=a-1;j--) L.elem[j+1]= L.elem[j]; L.elem[a-1] = b; L.length ++; return true; } bool ListDelete(SqList &L,int local){ if(local<1 || local > L.length) return false; for (int j = local - 1;j < L.length - 1;j++){ L.elem[j] = L.elem[j+1]; } L.length --; return true; } bool print(SqList &L){ for(int i = 0 ;i < L.length -1 ;i++){ cout<<L.elem[i]<<"-->"; } cout<<L.elem[L.length-1]<<endl; } int main() { int number; do{ cout<<"1----初始化一个线性表"<<endl; cout<<"2----销毁一个线性表"<<endl; cout<<"3----清空线性表"<<endl; cout<<"4----判断线性表是否为空"<<endl; cout<<"5----求线性表长度"<<endl; cout<<"6----求线性表指定位置元素"<<endl; cout<<"7----求前驱"<<endl; cout<<"8----求后继"<<endl; cout<<"9----在线性表指定位置插入元素"<<endl; cout<<"10----删除线性表指定位置元素"<<endl; cout<<"11----显示线性表"<<endl; cout<<" 退出,输入一个负数!"<<endl; cout<<"请输入一个操作代码:"<<endl; cin>>number; SqList biao; if (number == 1){ string return_content = InitList(biao); cout<<return_content<<endl; } else if (number == 2) { DestroyList(biao); cout<<"销毁表成功!!"<<endl; } else if (number == 3){ ClearList(biao); cout<<"清空表成功!!"<<endl; } else if (number ==4 ){ bool result = Getresult(biao); if (result) cout<<"该链表不为空"<<endl; else{ cout<<"该链表为空"<<endl; } } else if (number == 5){ int length = GetLength(biao); cout<<"表的长度为:"<<length<<endl; } else if (number ==6) { cout<<"请输入你想查询的位置:"<<endl; int local; cin>>local; CheckList(biao,local); } else if (number ==7) { cout<<"请输入你想查询的位置:"<<endl; int local; cin>>local; CheckListQ(biao,local); } else if (number == 8) { cout<<"请输入你想查询的位置:"<<endl; int local; cin>>local; CheckListH(biao,local); } else if (number ==9){ cout<<"请输入你插入的位置和内容:"<<endl; int a,b; cin>>a>>b; bool panduan = ListInsert(biao,a,b); if (panduan) cout<<"插入成功!!"<<endl; else{ cout<<"插入失败!!!"<<endl; } } else if (number == 10){ cout<<"请输入你想删除元素的位置: "<<endl; int local; cin>>local; bool panduan = ListDelete(biao,local); if(panduan) cout<<"删除成功!!"<<endl; else{} cout<<"删除失败!!!"<<endl; } else if (number ==11){ print(biao); } else if (number > 11){ cout<<"你的输入有误,请重新输入……"<<endl; } cout<<endl; cout<<endl; }while(number > 0); cout<<"成功退出程序。"<<endl; }