数据结构线性表操作实验报告.doc_第1页
数据结构线性表操作实验报告.doc_第2页
数据结构线性表操作实验报告.doc_第3页
数据结构线性表操作实验报告.doc_第4页
数据结构线性表操作实验报告.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构实验报告实验题目:线性表的操作实验目的:1.掌握上机调试线性表的基本方法; 2.掌握线性表的一些基本操作;实验内容:将两个有序链表合并为一个有序链表一、需求分析1.实验程序中先创建两个有序链表,演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入两个链表中的相应数据。2.将两个链表合并时可按数据从大到小或从小到大合并,用户根据提示可选择一种排序方式。3.程序执行命令包括:(1)构造链表;(2)输入数据;(3)合并两个链表,根据用户需求选择一种排序方式;(4)将合并结果输出;(5)结束4.测试数据: 链表1数据为:2,4,6,7,10 链表2数据为:1,3,5,6,7,12 按从小到达合并为:1,2,3,4,5,6,6,7,7,10,12; 按从大到小合并为:12,10,7,7,6,6,5,4,3,2,1;二、概要设计 1.基本操作Linklist creat()操作结果:构造一个链表,并输入数据,返回头节点指针。void print(Linklist head)初始条件:链表已存在;操作结果:将链表输出。void MergeList_1(Linklist La,Linklist Lb)初始条件:有序线性链表La和Lb已存在;操作结果:将La和Lb两个链表按从小到大的顺序合并。void MergeList_2(Linklist La,Linklist Lb)初始条件:有序线性链表La和Lb已存在;操作结果:将La和Lb两个链表按从大到小的顺序合并。2.本程序包括四个模块:(1)主程序模块;(2)链表数据输入模块;将新链表输出按从小到大合并两链表(3)链表合并模块;(4)链表输出模块;数据输入主程序模块将新链表输出按从大到小合并两链表三、详细设计1.元素类型,节点类型,指针类型typedef struct LNode /定义节点int data;struct LNode *next;LNode,* Linklist;2.每个模块的分析(1)主函数模块int main()Linklist head1,head2;int i;printf(请输入链表1数据(由小到大,输入0表示输入结束):n);head1=creat();/创建链表1,将头结点指针返回为head1printf(请输入链表2数据(由小到大,输入0表示输入结束):n);head2=creat();printf(请选择排序方式(输入1则从小到达合并,输入其它整数则按从大到小合并):);scanf(%d,&i);/创建链表2,将头结点指针返回为head2if(i=1) /选择两种排序方式,如果输入1,则合并后按从小到大输出;输入其它数,合成链表按从大到小输出printf(按小到大将两表合并得:n);MergeList1(head1,head2); /将创建好的两表的头结点地址head1,head2作为函数参数elseprintf(按从大到小将两表合并得:n);MergeList2(head1,head2); /将创建好的两表的头结点地址head1,head2作为函数参数return 0;(2)数据输入创建链表模块Linklist creat()/创建链表函数,并将创建链表的头结点指针返回Linklist head,p,s;int z=1,x;head=(LNode *) malloc(sizeof(LNode);p=head;while(z)scanf(%d,&x);if(x!=0) /输入0表示链表数据输入结束s=(LNode *)malloc(sizeof(LNode);s-data=x;p-next=s;s-next=NULL;p=s;else z=0;return(head); (3)合并链表模块,两个函数分别表示两种排序方式,将链表合并后直接在函数中调用链表输出函数void print(Linklist head)将链表输出void MergeList_1(Linklist La,Linklist Lb) /已知链表La和Lb元素都按从小到大排列,将La和Lb合并成新链表,其中元素也按从小到大排列Linklist pa,pb,pc,Lc;pa = La-next; pb = Lb-next;Lc = pc = La; /把La的头节点作为新建链表Lc的头结点while (pa & pb) if (pa-data data)pc-next = pa; pc = pa; pa = pa-next;else pc-next = pb; pc = pb; pb = pb-next; pc-next = pa ? pa : pb; /插入剩余段 print(Lc);/将链表Lc输出void MergeList_2(Linklist La,Linklist Lb)/已知链表La和Lb的元素都按从小到大排列,合并La和Lb得到新链表,其中元素按照从大到小的顺序排列Linklist pa,qa,pb,qb,Lc; /设指针qa,qb,分别作为pa,pb的前驱的指针pa=La-next;pb=Lb-next;Lc=La;Lc-next=NULL;while(pa&pb)if(pa-datadata)qa=pa;pa=pa-next;qa-next=Lc-next;Lc-next=qa;elseqb=pb;pb=pb-next;qb-next=Lc-next;Lc-next=qb;while(pa)/如果pa不为空,则将La链的剩余段倒叙插入到头节点的后面qa=pa;pa=pa-next;qa-next=Lc-next;Lc-next=qa;while(pb)/如果pb不为空,则将Lb链的剩余段倒叙插入到头结点的后面qb=pb;pb=pb-next;qb-next=Lc-next;Lc-next=qb;print(Lc);/将新合成的链表Lc输出(4)链表输出模块,实现最终链表的输出void print(Linklist head) /链表输出函数,将链表输出LNode *p;p=head-next;if(head!=NULL)do printf(%d ,p-data);p=p-next; while (p);printf(n);四、程序使用说明及测试结果1.程序使用说明(1)本程序的运行环境为VC6.0;(2)进入演示程序后显示提示信息:请输入链表1数据(由小到大,输入0表示输入结束): 按要求输入数据请输入链表2数据(由小到大,输入0表示输入结束):按要求输入数据请选择排序方式(输入1则从小到达合并,输入其它整数则按从大到小合并): 输入数据选择合并方式2.测试结果 对链表1输入数据2,4,6,7,10,0 对链表2输入数据1,3,5,6,7,12,0输入数据选择排序方式:如果输入:1 输出结果为:1,2,3,4,5,6,6,7,7,10,12如果输入:3(整数非1) 输出结果为:12,10,7,7,6,6,5,4,3,2,13.调试中遇到的错误分析 第一次运行时有问题,看以看出它的排序方式是对的,但是输出是多出前面一个很大的数,可能是输出函数void print(Linklist head)有问题,检查程序:此处逻辑出错,直接将p指针指向head,然后就将p-data输出,因此第一个数是头指针head所对应节点的值,所以可将p=head;改为p=head-next;这样p就指向第一个节点。4.运行界面五、实验总结1.大部分的时间都用在了编程上,主要是因为C语言掌握的问题,C语言基础不好特别是对于C语言中链表的一些定义和基本操作不够熟练,导致在编程过程中还要不断的拿着c语言的教材查找,所以今后还要对C语言多练习,多动手,多

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论