收藏 分享(赏)

数据结构实验报告(2015级)及答案.doc

上传人:tangtianxu1 文档编号:3121803 上传时间:2018-10-04 格式:DOC 页数:116 大小:2.46MB
下载 相关 举报
数据结构实验报告(2015级)及答案.doc_第1页
第1页 / 共116页
数据结构实验报告(2015级)及答案.doc_第2页
第2页 / 共116页
数据结构实验报告(2015级)及答案.doc_第3页
第3页 / 共116页
数据结构实验报告(2015级)及答案.doc_第4页
第4页 / 共116页
数据结构实验报告(2015级)及答案.doc_第5页
第5页 / 共116页
点击查看更多>>
资源描述

1、数据结构实验报告专 业 _信息管理学院_年 级 _2015 级_学 号 _ _学生姓名 _ _ _指导老师 _华中师范大学信息管理系编2I 实验要求1每次实验中有若干习题,每个学生至少应该完成其中的两道习题。2上机之前应作好充分的准备工作,预先编好程序,经过人工检查无误后,才能上机,以提高上机效率。3独立上机输入和调试自己所编的程序,切忌抄袭、拷贝他人程序。4上机结束后,应整理出实验报告。书写实验报告时,重点放在调试过程和小节部分,总结出本次实验中的得与失,以达到巩固课堂学习、提高动手能力的目的。II 实验内容实验一 线性表【实验目的】1熟悉 VC 环境,学习如何使用 C 语言实现线性表的两种

2、存储结构。2通过编程、上机调试,进一步理解线性表的基本概念,熟练运用 C 语言实现线性表基本操作。3熟练掌握线性表的综合应用问题。【实验内容】1一个线性表有 n 个元素(nnext; q 是工作指针,指向链表中当前待处理结点。pre=head; pre 是前驱结点指针,指向 q 的前驱。 while(q!=null p 是链表中最后一个结点,无后继。 else 处理 p 和后继结点交换 q=p-next; 暂存 p 的后继。 pre-next=q; p 前驱结点的后继指向 p 的后继。p-next=q-next;p 的后继指向原 p 后继的后继。 q-next=p ;原 p 后继的后继指针指向

3、 p。 算法结束。4已知非空单链表第一个结点由 head 指出,请写一算法,交换 p 所指结点与其下一个结点在链表3中的位置。要求:该算法用函数 Reverse(head,p)实现,其中 head 为表头指针,p 指向要交换的结点;在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。5设有一个单链表,编写能够完成下列功能的算法:找出最小值的结点,且打印该数值;若该数值是奇数,则将其与直接后继结点交换;若该数值是偶数,则将其直接后继结点删除。要求:编写主函数验证算法的正确性。6在一链表中,已知每个结点含有三个域:data、next 和 prior,其中 prior 域为空

4、,设计一个算法,使每个结点的 prior 指向它的前驱结点,形成双向循环链表。要求:建立一个结点中含有三个域的单链表;在主函数中调用此算法,构成双向循环链表;在主函数中利用正向和逆向两种方式输出链表中的数据,验证算法的正确性。7用链表建立通讯录。通讯录内容有:姓名、通讯地址、电话号码。要求:通讯录是按姓名项的字母顺序排列的;能查找通讯录中某人的信息;提示:可用链表来存放这个通讯录,一个人的信息作为一个结点。成链的过程可以这样考虑:先把头结点后面的第一个数据元素结点作为链中的首结点,也是末结点。从第二个数据开始逐一作为工作结点 ,需从链表的首结点开始比较,如果工作结点的数据比链中的当前结点的数据

5、小,就插在其前面。否则,再看后面是否还有结点,若没有结点了就插在其后面成为末结点;若后面还有结点,再与后面的结点逐一比较处理。4【实验报告】实习时间:2016/10/14 实习地点: 实习机号:具体实验内容作了 1,2,3,4,5,6 题1 题采用顺序存储表示实现的算法:主数:运行结果:19算法代码:bool Insert_Sq(SqList if(L.length=L.listsize)L.elem=(ElemType *)realloc(L.elem,(L.listsize+L.incrementsize)*sizeof(ElemType);if(!L.elem) return false

6、;L.listsize+=L.incrementsize;for(i=L.length-1;x=0;i-)L.elemi+1=L.elemi;L.elemi+1=x;L.length+;return true;采用链表实现的算法:20主函数:运行结果:21算法代码:void Insert_L(LinkList p=L-next;q=L;while(p)if(xp-dataq=q-next;else if(xp-datam-data=x;p-next=m;m-next=NULL;return; else m=(LinkList)malloc(sizeof(LNode);m-data=x;m-ne

7、xt=p;q-next=m;return; 比较两种算法的优劣:顺序表和链表都要和 x 逐项比较,顺序表找到 x 应放的位置之后插入,后面的元素都要向后移位,但链表只需修改指针即可,链表相对易操作一些222 题算法:主函数:代码:void Delete_L(LinkList 23coutx;LinkList p,q;p=L;if(!(p-next) coutnext)if(x=p-next-datap-next=q-next;free(q);return ;else if(x=p-next-datap-next=NULL;free(q);return; p=p-next; coutnext;w

8、hile(p-next!=NULL)q=p;while(q-next!=NULL)if(q-next-data=p-data)m=q-next;q-next=m-next;free(m);else q=q-next; p=p-next; 4 题算法:26主函数:头文件并且定义了全局变量:运行结果:算法代码:void Reverse_L(LinkList q=head-next;pre=head;while(q!=NULL q=q-next;27if(p-next=NULL) coutnext;pre-next=q;p-next=q-next;q-next=p; return;5 题算法:28主

9、函数:操作结果:29算法代码:void findmin_L(LinkList LinkList p,q,pre,q_pre;p=L-next;pre=L;e=p-data;while(p) if(ep-data)e=p-data;q=p;q_pre=pre;p=p-next;pre=pre-next; coutnext|!(e%2)m=q-next;q_pre-next=m;q-next=m-next;m-next=q;coutnext;q-next=m-next;30free(m); coutnext-data!=0)m-next-prior=m;m=m-next;m-next-prior=

10、m;结果:33程序调试过程程序运行过程出现的错误1 题:用顺序表操作比较顺利,但用链表进行比较时,找到相应位置后,插入过程出现错误,编的错误代码使插入的操作变为替换后边的紧邻结点的操作2 题:编写过程无错误3 题:算法思想是第一个结点的数和后面的依次比较,如果相等,就删掉,然后再从第二个节点继续做和第一个结点一样的事,直到最后为空,但我在编的过程中却不知如何实现此操作,后来百度了一下:让循环套循环,内层的循环让固定一个结点的数依次和后面的比较,相同的删除,内部结束后 p=p-next;然后再做相同的操作,直到结点最后。4 题:(1)此题定义了全局变量,但是一开始编程序时,却莫名其妙在主函数里又

11、定义了一次,此时,操作的就是主函数里的这个 m,而全局变量没有进行任何操作,因而在编的函数里用m 时,程序会出现错误。(2)在调换两结点位置时,有发生错误。5 题:(1)在求最小值并执行完 p=p-next 之后,p 指向空值,但在初编此程序时,却想当然以为p 求出最小值后指向最小值所在结点,因而在后面 if(e%2后,head=p;建立链表后并 p-next=head;为了也给 k 赋头结点,写成了 p-next=head=k;但这样却使 head 前继后继都变为空了。(2)在循环输入一组整数时,用的是 cina;,然后在输入数的时候直接:2 3 4 5 6 7 8 9 0 这样输入,但是由

12、于 cin 任何类型都可以输入,所以空格也会被输入,因而出现错误,如果用cin 输入整数,可以借助数组,int a5;for(i=0;iai;34实习小结在编代码过程中出现的若干错误,有一部分是本来就不知道,有一些事由于不熟练,不熟悉所以导致错误,也有一些是由于马虎。当编码可以通过却无法产生结果时,通过逐步地调试,可以发现出错地方以及出错的原因,我觉得调试的过程就是不断进步,自我纠错的过程。编出代码,运行,改正,再完善-在这个过程中,编写代码的思维就更完善,更熟练,犯得低级错误也会越来越少。实验二 堆栈与队列【实验目的】1学习如何使用 C 语言实现堆栈与队列。2熟悉堆栈与队列的基本操作及应用。

13、【实验内容】1 现有一顺序循环队列,其结构描述为:# define MAX 100typedef struct ElemType queueMaxQueueSize;int front; / 队头指针int count; / 计数器QueueType;要求:设计队列的几种几种操作:初始化、进队、出队、取队头元素和判断队列是否非空。编写一个主函数进行测试。2已知 Q 是一个非空队列, S 是一个空栈。编写算法实现:将队列 Q 中的所有元素逆置。要求:调用堆栈和队列的操作函数实现该算法。编写一个主函数进行测试。3设计一个算法,将计算机产生的 n 个随机数分为奇数、偶数两组,并将它们分别压入两个栈中

14、,然后在屏幕上输出。4编写一个程序,反映病人到医院看病排队看医生的情况。在病人排队过程中,主要重复两件事:35病人到达诊室,将病历交给护士,排到等候队列中候诊。护士从等待队列中取出下一个病人的病历,该病人进入诊室就诊。要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下:排队输入排队病人的病历号,加入到病人排队队列中;就诊病人排队队列中最前面的病人就诊,并将其从候诊队列中删除;查看排队从队首到队尾列出所有的排队病人的病历号;不再排队,余下依次就诊从队首到队尾列出所有的排队病人的病历号,并退出运行;下班退出运行。36【实验报告】实习时间:2016/10/21 实习地点:九号楼八楼

15、机房 实习机号:具体实验内容做了 1,2,3,4 题1 题头文件:定义结构体:编写的初始化、进队、出队、取队头元素和判断队列算法:37主函数:38运行结果:算法代码:bool Init_Sq(QueueType if(!Q.queue) exit(1);Q.front=Q.rear=0;Q.count=0;Q.queuesize=maxsize;bool enq_Sq(QueueType Q.queueQ.rear=e;Q.rear=(Q.rear+1)%Q.queuesize;Q.count+;return true; bool deq_Sq(QueueType else e=Q.queue

16、Q.front;Q.front=(Q.front+1)%Q.queuesize;39Q.count-;return true; bool getq_Sq(QueueType Q,ElemType e=Q.queueQ.front;return true;bool empty_Sq(QueueType Q)return Q.count=0; 2 题:头文件:算法:主函数:40结果:算法代码:void inverse(SqQueue ElemType e;InitStack_Sq(S);while(!QueueEmpty_Sq(Q)DeQueue_Sq(Q,e);Push_Sq(S,e);while(!StackEmpty_Sq(S)Pop_Sq(S,e);EnQueue_Sq(Q,e);413 题头文件:算法:主函数:运行结果:424 题头文件:算法:43主函数:运行结果:44算法代码:void en(SqQueue cout“输入病历号,可输入多个病历号,直到输入-1 为止“endl;while(1)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 农林牧渔

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报