赞
踩
1.实验性质:设计性实验
2.要求:
3.实验目的
通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,学生编写程序时,要考虑程序的健壮性,熟练掌握通过函数参数返回函数结果的办法。
4.实验内容
编程实现顺序表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其变成一个完整的小软件。
5.参考界面
6.验收/测试用例
通过菜单调用各个操作,测试点:
实验步骤:
//重点阐述设计思想
首先将要输入的提示信息写入一个函数中,在main函数中调用提示信息;
根据提示信息的顺序在main函数之前写出相对应的函数名和函数体,再通过main函数调用显示;
在编写相对应操作的函数时考虑全面,考虑到非法操作时的操作结果;
在编写函数体之前需要先定义顺序表,再初始化顺序表,再按照提示信息的内容一步步编写相对应的函数体;
实验记录:
先定义一个顺序表并进行初始化
- #define ERROR 0
- #define OK 1
- #define OVERFLOW -2
- #define MAXSIZE 100
- #define LISTINCREMENT 10
-
- typedef int ElemType; //定义数据类型,相当于给int取别名为ElemType
-
- typedef struct //定义顺序表
- {
- ElemType *elem; //定义指针
- int length; //顺序表长度
- int listsize; //顺序表大小
- }SqList;
-
- typedef int Status; //定义Status为int类型,否则后续会报错
-
- Status InitList_Sq(SqList &L) //初始化
- {
- L.elem=new ElemType[MAXSIZE];
- L.length=0;
- if(!L.elem)
- exit(OVERFLOW);
- L.listsize=MAXSIZE;
- return OK;
- }
根据实验所需进行相关的操作代码的编写
1. 清空线性表
顺序表的长度为零即可
- void ClearList(SqList &L) //清空
- {
- L.length=0;
- }
2. 判断线性表是否为空
如果顺序表的长度为0返回true,否则返回false。
- bool IsEmpty(SqList L) //判断是否为空
- {
- if(L.length==0)
- return true;
- else
- return false;
- }
3. 求线性表长度
返回顺序表的长度
- int GetLength(SqList L) //求长度
- {
- return L.length;
- }
4. 获取线性表指定位置元素
首先先判断输入的位置是否在顺序表长度的范围内
然后取出所要取的位置的值
- Status GetElem(SqList &L,int i,ElemType &e) //取值
- {
- if(i<1 || i>L.length)
- {
- cout << "输入位置不在有效范围内,请重新输入" << endl;
- return ERROR;
- }
- e=L.elem[i-1]; //指针共顺序表的[0]位置开始,输入的i从1开始,所以取的位置是L.elem[i-1]
- cout << i << "位置上的元素是:" << e << endl;
- return OK;
- }
5. 求前驱
同样先判断所输位置是否合法
前驱即为所取值的前一个数,故算法跟取值的相类似
- Status PriorElem(SqList &L,int i,ElemType &e) //前驱
- {
- if(i<=1 || i>L.length)
- {
- cout << "输入有误,请重新输入" << endl;
- return ERROR;
- }
- e=L.elem[i-2];
- cout << i << "的前驱是:" << e << endl;
- return OK;
- }
6. 求后继
求后继是同样的道理
- Status NextElem(SqList &L,int i,ElemType &e) //后继
- {
- if(i<1 || i>=L.length)
- {
- cout << "输入有误,请重新输入" << endl;
- return ERROR;
- }
- e=L.elem[i];
- cout << i << "的后继是:" << e << endl;
- return OK;
-
- }
7. 在线性表指定位置插入元素
- Status ListInsert_Sq(SqList &L,int i,ElemType e) //插入
- {
- if(i<1 || (i>L.length+1))
- {
- cout << "输入有误,请重新输入" << endl;
- return ERROR;
- }
- if(L.length==MAXSIZE) return ERROR; //顺序表的长度超过了最大值,范围ERROR
- for(int j=L.length-1;j>=i-1;j--) //顺序表的值循环后移,从最后一个值到需要插入的位置
- L.elem[j+1]=L.elem[j];
- L.elem[i-1]=e; //跟取值的思想相类似,只不过把取值变成插入值
- ++L.length; //插入值后长度增加
- //cout << "插入成功” <<endl;
- return OK;
- }
8. 删除线性表指定位置元素
- Status ListDelete(SqList &L,int i) //删除
- {
- if(i<1 || i>L.length)
- {
- cout << "输入有误,请重新输入" << endl;
- return ERROR;
- }
- for(int j=i;j<=L.length-1;j++) //从需要删除的值开始到最后一个循环前移一个位置
- L.elem[j-1]=L.elem[j];
- --L.length; //长度减1
- cout << "删除成功" << endl;
- return OK;
- }
9. 显示线性表
- void Display_List(SqList L) //显示
- {
- for(int i=1;i<=L.length;++i) //循环显示,此处从0开始到L.length-1同样可以
- cout << L.elem[i-1] << " ";
- cout << endl;
- }
销毁函数
- void DestoryList(SqList &L) //销毁
- {
- if(L.elem) delete[] L.elem;
- L.length=0;
- L.elem=NULL;
- }
根据题目要求显示的信息
- 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;
- }
根据题目信息和所写的函数进行编写main函数
- int main()
- {
- Show_help(); //显示提示信息
- int n;
- SqList L;
- InitList_Sq(L); //初始化顺序表
- int i;
- ElemType e;
-
- while(1) //循环输入
- {
- cout << "请输入操作代码:" ;
- cin >> n;
- if(n==1) //清空
- {
- ClearList(L);
- }
- else if(n==2) //判断是否为空
- {
- if(IsEmpty(L))
- cout << "The list is empty" << endl;
- else cout << "The list is no empty" << endl;
- }
- else if(n==3) //求长度
- {
- cout << "The length of list is:" << GetLength(L) << endl;
- }
- else if(n==4) //获取指定位置元素
- {
- cout << "输入要获取元素的位置:" ;
- cin >> i;
- GetElem(L,i,e);
-
-
- }
- else if(n==5) //求前驱
- {
- cout << "输入要获取前驱的元素的位置:";
- cin >> i;
- PriorElem(L,i,e);
-
-
- }
- else if(n==6) //求后继
- {
- cout << "输入要获取后继的元素的位置:";
- cin >> i;
- NextElem(L,i,e);
-
-
- }
- else if(n==7) //指定位置插入元素
- {
- cout << "请输入要插入的位置和元素:";
- cin >> i >> e;
- ListInsert_Sq(L,i,e);
- }
- else if(n==8) //删除指定位置元素
- {
- cout << "输入你要删除的元素位置:";
- cin >> i;
- ListDelete(L,i);
-
- }
-
- else if(n==9) //显示线性表
- {
- cout << "The List is:";
- Display_List(L);
- }
- else if(n<0) //输入其他数退出循环
- {
- break;
- }
- else
- cout << "输入有误,请重新输入" << endl;
- }
- DestoryList(L); //结束之后需要销毁顺序表
- return 0;
-
- }
实验中遇到的问题及解决方案
在顺序表初始化时,由于没有定义Status的含义,导致后面的函数调用全部发生错误。经观看视频和调试后改正。
在调用查找、前驱和后驱函数的时候,将函数调用操作放在了输出的后面,导致输出结果一直错误,经不断尝试和查看代码后发现并改正。
每个操作实现后没有相应的提示信息,也不知道是正确还是错误,在代码调试阶段加入了反馈信息。
总结与心得
心得:在一开始写代码的时候还是缺少了相应的规划,在写的时候漏洞百出,经常不是这里出错就是那里出错,都是在调试中修改完成的代码,这大大降低了完成代码的进度。每次在写代码前应该要好好的规划需要用到哪些东西,需要考虑周全。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。