1、火车车厢重排问题队列c语言计算机科学与工程学院算法与数据结构试验报告 一 专业班级10 级计算机工程 02试验地点计算机大楼计工教研室学生学号22指导教师蔡琼学生姓名肖宇博试验时间2012-4-21试验项目算法与数据结构试验类别基础性() 设计性() 综合性()其它( )试(1)掌握队列的特点及其存储方法;验目(2)掌握队列的常见算法和程序实现。的及要求成绩评定表类别评分标准分值得分合计上机表现积极出勤、遵守纪律30 分主动完成设计任务程序与报告程序代码规范、功能正确70 分报告详实完整、体现收获备注:评阅教师:日 期:年 月 日试验内容一、实验目的和要求1、实验目的:(1)掌握队列的特点及其
2、存储方法;(2)掌握队列的常见算法和程序实现。2、实验内容 :火车车厢重排问题。转轨站示意图如下:H13H3入 轨H29631581HH入 轨3出 轨742H2(a)将 369、247 依次入缓冲轨96H1554321入 轨H3出 轨87H2(c) 将 8 入缓冲轨, 5 移至出轨1出 轨96H1584321H入 轨3出 轨7H2(b)将 1 移至出轨, 234 移至出轨H11入 轨H3出 轨H2(d) 将 6789 移至出轨火车车厢重排算法伪代码如下:1.分别对 k 个队列初始化;2. 初始化下一个要输出的车厢编号 nowOut = 1;3.依次取入轨中的每一个车厢的编号;如果入轨中的车厢编
3、号等于 nowOut,则输出该车厢;nowOut+ ;否则,考察每一个缓冲轨队列for (j=1; j=k; j+)取队列 j 的队头元素 c;如果 c=nowOut,则将队列 j 的队头元素出队并输出;nowOut+ ;如果入轨和缓冲轨的队头元素没有编号为 nowOut的车厢,则求小于入轨中第一个车厢编号的最大队尾元素所在队列编号 j;如果 j 存在,则把入轨中的第一个车厢移至缓冲轨 j ;如果 j 不存在,但有多于一个空缓冲轨,则把入轨中的第一个车厢移至一个空缓冲轨;否则车厢无法重排,算法结束;3、实验要求:使用顺序存储队列的方式完成该实验。二、设计分析根据实验要求,采用队列来完成本次实验
4、。实验中定义了三个队列,一个用来存储输入的车厢号,另两个用来存储缓存出队顺序及序号。三、源程序代码#include#include#define Max 20typedef structint dataMax;int front,rear;squeue;void initqueue(squeue *&q)q=(squeue *)malloc(sizeof(squeue);q-front=q-rear=0;void enqueue(squeue *&q,int e)q-rear=(q-rear+1)%Max;q-dataq-rear=e;void dequeue(squeue *&q)q-fro
5、nt=(q-front+1)%Max;int gettop(squeue *&q)return q-dataq-front+1;int getrear(squeue *&q)return q-dataq-rear;void reset(squeue *&q,squeue *&w1,squeue *&w2,int k)int nowout=1;int n1=0,n2=0;for(int i=0;idataq-front+1=nowout)printf(%d 号车厢出轨! t,q-dataq-front+1);nowout+;dequeue(q);else if(gettop(w1)=nowout
6、)printf(%d 号车厢出轨! t,gettop(w1);nowout+;dequeue(w1);else if(gettop(w2)=nowout)printf(%d 号车厢出轨! t,gettop(w2);nowout+;dequeue(w2);elseint c=gettop(q);n1=getrear(w1);n2=getrear(w2);if(n1n2)if(cn1)enqueue(w1,c);dequeue(q);elseenqueue(w2,c);dequeue(q);elseif(cn2)enqueue(w2,c);dequeue(q);elseenqueue(w1,c);
7、dequeue(q);int examenter(int a,int k)for(int i=1;i=k;i+)if(ai!=i)return 0;break;void main()squeue *q,*w1,*w2;initqueue(q);initqueue(w1);initqueue(w2);int a10,k;label: printf( 要输入几个车厢? n);scanf(%d,&k);if(k=0)printf( 请输入正确的车厢号 !n);printf(*);printf(n);goto label;label2: printf( 输入重排前的序列 n);for(int i=1;
8、i=k;i+)scanf(%d,&ai);enqueue(q,ai);int r=examenter(a,k);if(r=0)printf( 您的输入车厢号有误 ! 请输入连续自然数 :n); goto label2;else if(r!=0)printf( 重排前的序列为 n);for(i=1;i=k;i+)printf(%dt,ai);printf(n);printf( 排列后的车厢号为: n);reset(q,w1,w2,k);elseprintf( 我也不知道错哪了? );四、测试用例(尽量覆盖所有分支)1.输入正确的序列后得到结果如图:2.倒输这几个数如图:3.顺序输这个序列4.如果
9、输入的车厢数有误的时候(为负数或零)5.如果输入的序列不是连续自然数五、实验总结先后学习了 C/C+,对编程语言基本上有一些了解,但在数据结构试验程序设计过程中还是学到了很多。经过两天的设计, 在不断翻阅以前资料的情况下, 有针对性的复习了 C/C+中指针、循环的相关理论知识和的基础知识和应用技巧,最后比较成功的完成了本次的设计。这次的实验是完成火车厢重徘问题,依旧采用的检查用户的错误输入机制,充分考虑了用户的各种错误,比如输入的序列不是连续自然数,如果输入的车厢数有误的时候(为负数或零)等等的情况,完成了该次实验,主要出现的问题在于数组的下标问题,老是出现越界访问错误等等,这要在下次的实验当中多加注意!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1