数据结构--实验报告 线性表的基本操作

上传人:a**** 文档编号:121639334 上传时间:2022-07-19 格式:DOC 页数:19 大小:372KB
返回 下载 相关 举报
数据结构--实验报告 线性表的基本操作_第1页
第1页 / 共19页
数据结构--实验报告 线性表的基本操作_第2页
第2页 / 共19页
数据结构--实验报告 线性表的基本操作_第3页
第3页 / 共19页
点击查看更多>>
资源描述
?数据结构?实验报告前言计算机编程中加工处理的对象是数据,而数据具有一定的组织结构,所以学习计算机编程仅仅了解计算机语言是不够的,还必须掌握数据的组织、存储和运算的一般方法,这便是数据结构课程中所研究的内容,也是我们编写计算机程序的重要根底,由于它对计算机学科起到承前启后的作用,因此本课程被列为计算机等相关专业最重要的专业根底课;同时数据结构是计算机专业教学的一门核心课程。计算机各领域都要用到各种数据结构,而且要从事计算机科学与技术工作,尤其是计算机领域的软件开发工作,必须具备较强的数据结构根底。数据结构课程内容丰富、学习量大,实践性强;隐含在各局部内容中的方法和技术多;算法设计具有动态性和抽象性等特点,看懂听明白与掌握会应用之间有相当大的一段距离。所以学生必须多实践才能进一步加深对课程的理解,理解和掌握算法设计所需的方法和技术,为整个专业学习打下良好的根底。目录一、 实验目的二、 实验内容和要求三、 源代码1) 顺序表的代码2) 单链表的代码四、 测试结果1) 顺序表的测试结果 2) 单链表的测试结果 五、心得体会 实验一 线性表的根本操作及其应用一、实验目的1、帮助读者复习C+语言程序设计中的知识。2、熟悉线性表的逻辑结构。3、熟悉线性表的根本运算在两种存储结构上的实现。4、掌握顺序表的存储结构形式及其描述和根本运算的实现。5、熟练掌握动态链表结构及有关算法的设计二、实验内容题目一:顺序表的根本操作问题描述实现顺序表的建立、求长度,取元素、修改元素、插入、删除等顺序表的根本操作。根本要求1依次从键盘读入数据,建立带头结点的顺序表; 2输出顺序表中的数据元素3求顺序表的长度;4根据指定条件能够取元素和修改元素;5实现在指定位置插入和删除元素的功能。6根据算法,将两个有序的顺序表合并成一个有序顺序表。 测试数据 由学生任意指定。题目二:单链表的根本操作问题描述实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的根本操作。根本要求1依次从键盘读入数据,建立带头结点的单链表; 2输出单链表中的数据元素3求单链表的长度;4根据指定条件能够取元素和修改元素;5实现在指定位置插入和删除元素的功能。6根据算法,将两个有序的单链表合并成一个有序单链表。 测试数据 由学生任意指定。三、源代码(一) 顺序表的根本操作#includeusing namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct /结构体ElemType *elem;int length;int listsize;SqList;SqList Lx;Status InitList_Sq(SqList &L) /分配空间 L.elem=new ElemTypeLIST_INIT_SIZE; if(!L.elem)exit(OVERFLOW); L.length =0; L.listsize=LIST_INIT_SIZE; return OK;Status ListInsert(SqList &L,int i,ElemType e) /插入新元素 int *q,*p;ElemType *newbase;if(iL.length+1) return ERROR;if(L.length=L.listsize) newbase=new ElemTypeL.listsize+LISTINCREMENT; if(!newbase) exit(OVERFLOW); L.elem=newbase; L.listsize+=LISTINCREMENT; q=&(L.elemi-1); for (p=&(L.elemL.length-1);p=q;-p) *(p+1)=*p; *q=e; +L.length; return OK;Status Listlength(SqList L) /长度 int *p=L.elem; /判断线形表是否存在while(p) return (L.length); Status GetElem(SqList L, int i,ElemType &e) /取元素 if(iL.length)return ERROR;else e=L.elemi-1;return e;void MergeList(SqList La,SqList Lb,SqList &Lc) /合并 ElemType ai,bj;InitList_Sq(Lc);int i=1,j=1,k=0;int La_len,Lb_len;La_len=Listlength(La);Lb_len=Listlength(Lb);while(i=La_len)&(j=Lb_len) GetElem(La,i,ai);GetElem(Lb,j,bj); if(ai=bj) ListInsert(Lc,+k,ai);+i; else ListInsert(Lc,+k,bj);+j; while(i=La_len) GetElem(La,i+,ai);ListInsert(Lc,+k,ai);while(j=Lb_len) GetElem(Lb,j+,bj);ListInsert(Lc,+k,bj);void show(SqList L,int i) /显示 int j;ElemType k; cout顺序表显示如下:endl; for(j=0;ji-1;j+) k=L.elemj; coutk; if(j=i-1 & i0) k=L.elemj; coutk; coutendl;void create(SqList &L,int n) /输入元素 int e;for(int i=0;ie;L.elemi=e;L.length=i+1; Status ListDelete_Sq(SqList &L,int i,ElemType &e) /删除 ElemType *p, *q;if(iL.length) return ERROR;p=&(L.elemi-1);e=*p;q=L.elem+L.length-1;for(+p;p=q;+p) *(p-1)=*p;-L.length;return OK;Status Listxiugei(SqList &L,int i,ElemType &e) /修改 if(iL.length)return ERROR; else L.elemi-1=e; return OK; void shuru(SqList &L1) /顺序表的创立 int a;InitList_Sq(L1);couta;cout请输入顺序表的元素(共a个)endl; create(L1,a); show(L1,a);void chaxun(SqList &L1) /取第i个位置的元素 int j;ElemType e1;coutj; while(jListlength(L1) cout输入有误,请重新输入endl;coutj; GetElem(L1,j,e1);cout取出的元素为:e1endl;void xiugai(SqList &L1) /修改第i个位置的元素 int a;int j; ElemType e1;a=L1.length;coutj;while(jListlength(L1) cout输入有误,请重新输入endl;coutj; coute1;Listxiugei(L1,j,e1);cout修改后的顺序表数据:endl;show(L1,a);void shanchu(SqList &L1) /删除顺序表里的元素 int a;int j; ElemType e1;a=L1.length;coutj;while(jListlength(L1) cout输入有误,请重新输入endl;coutj; ListDelete_Sq(L1,j,e1);cout修改后的顺序表数据:endl;show(L1,a-1);void charu(SqList &L1) /插入元素到顺序表里 int a; int j; ElemType e1;a=L1.length;coutj;while(jListlength(L1) cout输入有误,请重新输入endl;coutj; coute1;ListInsert(L1,j,e1);cout修改后的顺序表数据:endl;show(L1,a+1);void hebing(SqList &L3) /合并两个顺序表 SqList L1,L2; int a,b; InitList_Sq(L1); InitList_Sq(L2); couta; cout请输入第一个有序表的元素(共a个)endl; create(L1,a); show(L1,a); coutb; cout请输入第二个有序表的元素(共b个)endl; create(L2,b); show(L2,b); MergeList(L1,L2,L3); cout合并后的有序表如下:; show(L3,a+b);void main() /主菜单 int choice; for(;) cout 顺序表的根本操作endl; cout 1.顺序表的创立endl; cout 2.顺序表的显示endl; cout 3.顺序表的长度endl; cout 4.取第i个位置的元素endl; cout 5.修改第i个位置的元素endl; cout 6.插入元素到顺序表里endl; cout 7.删除顺序表里的元素endl; cout 8.合并两个顺序表endl; cout 9.退出系统endl; coutchoice; switch(choice) case 1: shuru(Lx);break; case 2: show(Lx,Lx.length);break; case 3: cout顺序表的长度:Listlength(Lx)endl;break; case 4: chaxun(Lx);break; case 5: xiugai(Lx);break; case 6: charu(Lx);break; case 7: shanchu(Lx);break; case 8: hebing(Lx);break; case 9: cout退出系统!endl;exit(0);break; default : cout输入有误,请重新选择endl;break; (二) 单链表的根本操作#includeusing namespace std;#define true 1#define false 0#define ok 1#define error 0#define overflow -2typedef int Status;typedef int ElemType;typedef struct LNode /存储结构 ElemType data; struct LNode *next;LNode,*LinkList;void CreateList(LinkList &L,int n) /尾插法创立单链表 LinkList p; L=new LNode; L-next=NULL; /建立一个带头结点的单链表 LinkList q=L; /使q指向表尾 for(int i=1;ip-data; p-next=NULL; q-next=p; q=p; Status GetElem(LinkList L,int i,ElemType &e)/取第i个元素 LinkList p=L-next; int j=1; while(p&jnext; +j; if(!p|ji) return error; /第i个元素不存在 e=p-data; return ok;Status LinkInsert(LinkList &L,int i,ElemType e) /插入 LinkList p=L; int j=0; while(p&jnext; +j; /寻找第i-1个结点 if(!p|ji-1) return error; /i小于1或者大于表长加1 LinkList s=new LNode; /生成新结点 s-data=e; s-next=p-next; /插入L中 p-next=s; return ok; Status ListDelete(LinkList &L,int i,ElemType &e) / 删除 LinkList p=L; LinkList q; int j=0; while(p-next&jnext; +j; if(!(p-next)|ji-1) return error; /删除位置不合理 q=p-next; p-next=q-next; /删除并释放结点 e=q-data; delete(q); return ok;void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) /合并两个顺序链表LinkList pa,pc,pb;pa=La-next;pb=Lb-next;Lc=pc=La;while(pa&pb) if(pa-datadata) pc-next=pa; pc=pa; pa=pa-next; else pc-next=pb; pc=pb; pb=pb-next; pc-next=pa?pa:pb; delete(Lb); void show(LinkList L) /显示 LinkList p; p=L-next; while(p) coutdata; p=p-next; coutnext; while(p) +i; p=p-next; return i; void xiugai(LinkList L) /修改 int i,j=1; ElemType k; ElemType e,m; LinkList p=L-next; cout请输入要修改的元素位置(0ii; GetElem(L,i,e); cout该位置的元素:eendl; coutk; while(p&jnext; +j; m=p-data; p-data=k; cout修改后的单链表显示如下:endl; show(L); void hebing() /合并两个单链表 int a,b; LinkList La,Lb,Lc; cout请输入第一个有序链表的长度:a; cout请输入第一个有序链表的元素共a个:endl; CreateList(La,a); show(La); cout请输入第二个有序链表的长度:b; cout请输入第二个有序链表的元素共b个:endl; CreateList(Lb,b); show (Lb); MergeList(La,Lb,Lc); cout合并后的有序链表如下:endl; show(Lc);void main() /主函数 int select; int x; ElemType y; LinkList list; for(;) cout 单链表的根本操作endl; cout 1.单链表的创立endl; cout 2.单链表的显示endl; cout 3.单链表的长度endl; cout 4.取第i个位置的元素endl; cout 5.修改第i个位置的元素endl; cout 6.插入元素到单链表里endl; cout 7.删除单链表里的元素endl; cout 8.合并两个单链表endl; cout 9.退出系统endl; coutselect; switch(select) case 1:cout请输入单链表的长度:x; cout请输入x个元素endl; CreateList(list,x); break; case 2: cout单链表显示如下:endl; show(list); break; case 3: int s; cout单链表的长度为:Length(list,s)endl; break; case 4: coutx; while(xLength(list,s) cout输入有误,请重新输入endl; coutx; GetElem(list,x,y); cout该位置的元素为:yendl; break; case 5: xiugai(list); break; case 6: coutx; while(xLength(list,s) cout输入有误,请重新输入endl; coutx; couty; LinkInsert( list,x,y); cout插入后单链表显示如下:endl; show(list); break; case 7: coutx; while(xLength(list,s) cout输入有误,请重新输入endl; coutx; ListDelete(list,x,y); cout要删除的元素值:yendl; cout删除后的单链表显示如下:endl; show(list); break; case 8: hebing(); break; case 9: exit(0); break; default : cout输入有误,请重新输入endl; break; 四、测试结果1) 顺序表 的测试结果2) 单链表的测试结果五、心得体会当听到老师说写数据结构实验报告时,我有点惊讶,才学了不到一个月,就要写实验报告。记得去年学习C+时,学了一个学期,程序设计用了三周,才完成的,这个实验报告居然要一周完成两个设计,觉得很难。但是现在一周过去了,我也写完了,自我感觉良好。通过这次写实验报告,我深切的理解了这门课的本质。刚开始学这门课时,当时还不清楚这门课程的目的,现在,我真正的理解了:数据结构像是身体的骨骼,而C+是填充这骨骼的肉体,二者相结合才能使整个程序更加完整,健全。数据结构是个框架,模型,抽象数据类型中列举了各种操作,而所用的C+语言,将各种操作描述出来构成算法。数据结构+算法=程序设计。在这次设计的过程中,我还遇到了,很多的问题。顺序表是按顺序存储的,用了一维数组来存储,又结合C+的程序设计,我又用了类,但是,在执行时出现了问题。后来问同学,指出我的错误,不过获益不少。我又重新整理思路,把顺序表的根本操作写好了。虽然走了很多弯路,但是让我认识到,一定要创新,大胆,不能按照旧的思路去干新的事情。单链表写起来简单多了,这个很快就搞定了。但是细节上出了问题。比方说,有些变量的重复定义,有些变量又没有定义,在调用函数,就直接复制过来,没有改参数通过修改,我深刻理解到:细节决定成败,在以后,不管做任何事情都要认真,细心。这次的实验报告,让我受益匪浅,不仅有知识方面的,还有生活和精神上的。总之,我会继续我的兴趣编程,相信在编程的过程中,能不断的提高自己。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!