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; typedef int ElemType; typedef int Status; #define MAXSIZE 100 #define listincrement 10 #define OK 1 #define ERROR 0
1.线性表的存储结构
需要有标的长度,当前表长,存储空间的基地址
typedef struct{ ElemType *elem;//存储空间的基地址 int length; int listsize;//当前表长 }SqList;
2.初始化线性表
思路:给线性表分配存储空间,长度置为0,表长置为最大长度MAXSIZE
Ststus InitList(SqList &L) { L.elem=new ElemType[MAXSIZE]; L.length=0; L.listsize=MAXSIZE; return OK; }
3.销毁线性表
思路:将存储空间释放,长度置为0,表长置为0
void DestoryList(SqList &L) { if(L.elem) delete[] L.elem; L.length=0; L.listsize=0; }
4.清空线性表
思路:将线性表的长度置为0
void ClearList(SqList &L) { L.length=0; }
5.判断线性表是否为空
思路:判断长度是否为0
bool ListEmpty(SqList L) { return L.length==0; }
6.求线性表长度
思路:直接返回线性表长度即可
Status GetLength(SqList L) { return L.length; }
7.获取线性表指定位置元素
思路:当输入的位置 i 在线性表合法范围之内,就输出下标 i-1。否则输入位置不合法。
注意:线性表序号是从1开始的。
void ChooseList(SqList L,int i) { if(i>0&&i<L.length) cout<<L.elem[i-1]<<endl; else cout<<"输入位置不合法!"<<endl; }
8.求前驱
思路:当输入的位置 i >1&& i <L.length,输出elem[i-2];
当输入的位置 i=1;第一个位置没有直接前驱
当输入的位置 i<0||i>L.length,输入位置不合法
void BeforeList(SqList L,int i) { if(i>1&&i<L.length) cout<<"指定位置前驱是:"<<L.elem[i-2]<<endl; else if(i==1) cout<<"第一个元素无前驱"<<endl; else cout<<"输入位置不合法!"<<endl; }
9.求后继
思路:当输入的位置 i >0&& i <L.length,输出elem[i];
当输入的位置 i=L.length;最后一个位置没有直接后继
当输入的位置 i<0||i>L.length,输入位置不合法
void AfterList(SqList L,int i) { if(i>0&&i<L.length) cout<<"该位置后继为:"<<L.elem[i]<<<endl; else if(i==L.length) cout<<"最后一个元素无后继"<<endl; else cout<<"输入位置不合法!"<<endl; }
10.在线性表指定位置插入元素
思路:当输入的位置 i < 1|| i >L.length+1,输入位置不合法;
当线性表长度length=MAXSIZE;线性表满了不能插入。
当输入的位置 i >1&&i<L.length时,从插入的位置 i(包括)往后的元素都往后移一个位置。再把e的值赋给elem[i-1],长度加一即可。
Status ListInsert(SqList &L,int i,ElemType e) { int j; if(i<1||i>L.length+1) return ERROR; if(L.length==MAXSIZE) return ERROR; for(j=L.length-1;j>=i-1;j--) { L.elem[j+1]=L.elem[j]; } L.elem[i-1]=e; ++L.length; return OK }
11.删除线性表指定位置元素
思路:当输入位置 i >0&&i<=L.length时,从位置 i后面的元素往前移动一个位置即可。
void DeleteList(SqList &L,int i) { if(i>0&&i<=L.length) { for(int k=i;k<L.length;k++) L.elem[k-1]=L.elem[k]; --L.length; } else cout<<"输入位置不合法!"<<endl; }
12.显示线性表
思路:从第一个序号开始到最后一个序号结束,输入元素即可。
void DisplayList(SqList L) { for(int i=1;i<=L.length;++i) cout<<L.elem[i-1]<<" "; cout<<endl; }
emm...最后整体代码
#include <iostream> #include<cstdlib> using namespace std; typedef int ElemType; //定义ElemType类型为int typedef int Status; #define MAXSIZE 100 // 顺序表的最大长度 #define LISTINCREMENT 10 #define OK 1 #define ERROR 0 typedef struct //若后面不再用,可省略结构名 { ElemType *elem; //存储空间的基地址 int length; int listsize; //当前表长 } SqList; //2.定义操作函数1 Status InitList(SqList &L) { //构造一个空的顺序表L。 L.elem = new ElemType[MAXSIZE]; L.length = 0; // 空表长度为0 L.listsize=MAXSIZE; return OK; } void DestroyList(SqList &L) { if (L.elem) delete[ ] L.elem; //释放存储空间 L.length=0; L.listsize=0; } //1.清空线性表 void ClearList(SqList &L) { L.length=0; //将顺序表的长度置0 } //2.判断线性表是否为空 bool IsEmpty(SqList L) { return L.length==0; } //3----求线性表长度 Status GetLength(SqList L) { return L.length; } //4----获取线性表指定位置元素 void ChooseList(SqList L,int i) { if(i>0 && i<= L.length) cout << L.elem[i-1] << endl; else cout << "你输入的位置不合法!" << endl; } //5----求前驱 void BeforeList(SqList &L,int i) { if(i>1 && i<=L.length) cout << "指定位置前驱是:" << L.elem[i-2] << endl; else if(i == 1) cout << "该位置无前驱!" << endl; else cout << "输入位置不合法!" << endl; } //6----求后继 void AfterList(SqList &L,int i) { if(i>0 && i<L.length) cout << "该位置的后继是:" << L.elem[i] << endl; else if(i == L.length) cout << "该位置无后继!" << endl; else cout << "输入位置不合法!" << endl; } //7.在线性表指定位置插入元素 Status ListInsert(SqList &L,int i,ElemType e) { int j; if((i<1)||(i>L.length+1))return ERROR; if(L.length==MAXSIZE)return ERROR; for(j=L.length-1; j>=i-1; j--) { L.elem[j+1]=L.elem[j]; } L.elem[i-1]=e; ++L.length; return OK; } //8----删除线性表指定位置元素 void DeleteList(SqList &L,int i) { if(i>0 && i<=L.length) { for(int k=i;k<L.length;k++) L.elem[k-1] = L.elem[k]; --L.length; } else cout << "输入位置不合法!" << endl; } //9.显示线性表 void DisplayList(SqList L) { for(int i=1;i<=L.length;++i) cout<<L.elem[i-1]<<" "; cout<<endl; } void show_help() { 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<<" 退出,输出一个负数!"<<endl; } int main() { int operate_code; show_help(); //定义线性表变量,如SqList L; SqList L; //调用初始化线性表函数,如 Init_List(L); InitList(L); ElemType e; int i; while(1) { cout<<"请输入操作代码:"; cin>>operate_code; if(operate_code==1) { //调用操作函数1 ClearList(L); } else if(operate_code==2) { if(IsEmpty(L)) cout<<"The list is empty."<<endl; else cout<<"The list is not empty."<<endl; } else if(operate_code==3) { cout<<"The length of list is :"<<GetLength(L)<<endl; } else if(operate_code==4) { cout<<"请输入获取元素的位置:"<<endl; cin>>i; ChooseList(L,i); } else if(operate_code==5) { cout<<"请输入你想求前驱元素的位置:"<<endl; cin>>i; BeforeList(L,i); } else if(operate_code==6) { cout<<"请输入你想求后继元素的位置:"<<endl; cin>>i; AfterList(L,i); } else if(operate_code==7) { cout<<"请输入插入元素及其位置:"<<endl; cin>>e>>i; if(ListInsert(L,i,e)==ERROR) cout<<"插入位置不合法!"<<endl; } else if(operate_code==8) { cout<<"请输入想要删除元素的位置:"<<endl; cin>>i; DeleteList(L,i); } else if(operate_code==9) { cout<<"The elements of the list are:"<<endl; DisplayList(L); } else if(operate_code<0) { break; } else { cout<<"\n操作码错误!!!"<<endl; cin.clear(); cin.sync(); show_help(); } } //调用销毁线性表函数,如 Destroy_List(L); DestroyList(L); return 0; }
总结:1.线性表的序号是从1开始的,所以求元素的时候要减去1才是下标。
2.求前驱后继,进行插入删除等操作时,要把位置的各种情况考虑考虑。
emm...就写这么多吧,以后再想起来再补充吧
- 清空操作后再测长度;