您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 火车车厢重排问题,队列,c语言
计算机科学与工程学院《算法与数据结构》试验报告[一]专业班级10级计算机工程02试验地点计算机大楼计工教研室学生学号1005080222指导教师蔡琼学生姓名肖宇博试验时间2012-4-21试验项目算法与数据结构试验类别基础性()设计性()综合性(√)其它()试验目的及要求(1)掌握队列的特点及其存储方法;(2)掌握队列的常见算法和程序实现。成绩评定表类别评分标准分值得分合计上机表现积极出勤、遵守纪律主动完成设计任务30分程序与报告程序代码规范、功能正确报告详实完整、体现收获70分备注:评阅教师:日期:年月日计算机科学与工程学院《算法与数据结构》试验报告2出轨入轨581H1H3H2963742出轨入轨58H1H3H29674321出轨入轨5H1H3H2968754321出轨入轨H1H3H2987654321(a)将369、247依次入缓冲轨(b)将1移至出轨,234移至出轨(c)将8入缓冲轨,5移至出轨(d)将6789移至出轨试验内容一、实验目的和要求1、实验目的:(1)掌握队列的特点及其存储方法;(2)掌握队列的常见算法和程序实现。2、实验内容:火车车厢重排问题。转轨站示意图如下:火车车厢重排算法伪代码如下:出轨入轨581742963987654321H1H3H2计算机科学与工程学院《算法与数据结构》试验报告33、实验要求:使用顺序存储队列的方式完成该实验。二、设计分析根据实验要求,采用队列来完成本次实验。实验中定义了三个队列,一个用来存储输入的车厢号,另两个用来存储缓存出队顺序及序号。三、源程序代码#includestdio.h#includestdlib.h#defineMax20typedefstruct{intdata[Max];intfront,rear;}squeue;voidinitqueue(squeue*&q){q=(squeue*)malloc(sizeof(squeue));q-front=q-rear=0;}1.分别对k个队列初始化;2.初始化下一个要输出的车厢编号nowOut=1;3.依次取入轨中的每一个车厢的编号;3.1如果入轨中的车厢编号等于nowOut,则3.1.1输出该车厢;3.1.2nowOut++;3.2否则,考察每一个缓冲轨队列for(j=1;j=k;j++)3.2.1取队列j的队头元素c;3.2.2如果c=nowOut,则3.2.2.1将队列j的队头元素出队并输出;3.2.2.2nowOut++;3.3如果入轨和缓冲轨的队头元素没有编号为nowOut的车厢,则3.3.1求小于入轨中第一个车厢编号的最大队尾元素所在队列编号j;3.3.2如果j存在,则把入轨中的第一个车厢移至缓冲轨j;3.3.2如果j不存在,但有多于一个空缓冲轨,则把入轨中的第一个车厢移至一个空缓冲轨;否则车厢无法重排,算法结束;计算机科学与工程学院《算法与数据结构》试验报告4voidenqueue(squeue*&q,inte){q-rear=(q-rear+1)%Max;q-data[q-rear]=e;}voiddequeue(squeue*&q){q-front=(q-front+1)%Max;}intgettop(squeue*&q){returnq-data[q-front+1];}intgetrear(squeue*&q){{returnq-data[q-rear];}}voidreset(squeue*&q,squeue*&w1,squeue*&w2,intk){intnowout=1;intn1=0,n2=0;for(inti=0;i50;i++){if(q-data[q-front+1]==nowout){printf(%d号车厢出轨!\t,q-data[q-front+1]);nowout++;dequeue(q);}elseif(gettop(w1)==nowout){printf(%d号车厢出轨!\t,gettop(w1));nowout++;计算机科学与工程学院《算法与数据结构》试验报告5dequeue(w1);}elseif(gettop(w2)==nowout){printf(%d号车厢出轨!\t,gettop(w2));nowout++;dequeue(w2);}else{intc=gettop(q);n1=getrear(w1);n2=getrear(w2);if(n1n2){if(cn1){enqueue(w1,c);dequeue(q);}else{enqueue(w2,c);dequeue(q);}}else{if(cn2){enqueue(w2,c);dequeue(q);}else{enqueue(w1,c);dequeue(q);}}}计算机科学与工程学院《算法与数据结构》试验报告6}}intexamenter(inta[],intk){for(inti=1;i=k;i++){if(a[i]!=i){return0;break;}}}voidmain(){squeue*q,*w1,*w2;initqueue(q);initqueue(w1);initqueue(w2);inta[10],k;label:printf(要输入几个车厢?\n);scanf(%d,&k);if(k=0){printf(请输入正确的车厢号!\n);printf(****************************************************);printf(\n);gotolabel;}label2:printf(输入重排前的序列\n);for(inti=1;i=k;i++){scanf(%d,&a[i]);enqueue(q,a[i]);}intr=examenter(a,k);if(r==0){printf(您的输入车厢号有误!请输入连续自然数:\n);计算机科学与工程学院《算法与数据结构》试验报告7gotolabel2;}elseif(r!=0){printf(重排前的序列为\n);for(i=1;i=k;i++){printf(%d\t,a[i]);}printf(\n);printf(排列后的车厢号为:\n);reset(q,w1,w2,k);}else{printf(我也不知道错哪了?');}}四、测试用例(尽量覆盖所有分支)1.输入正确的序列后得到结果如图:2.倒输这几个数如图:计算机科学与工程学院《算法与数据结构》试验报告83.顺序输这个序列4.如果输入的车厢数有误的时候(为负数或零)计算机科学与工程学院《算法与数据结构》试验报告95.如果输入的序列不是连续自然数计算机科学与工程学院《算法与数据结构》试验报告10五、实验总结先后学习了C/C++,对编程语言基本上有一些了解,但在数据结构试验程序设计过程中还是学到了很多。经过两天的设计,在不断翻阅以前资料的情况下,有针对性的复习了C/C++中指针、循环的相关理论知识和vc6.0的基础知识和应用技巧,最后比较成功的完成了本次的设计。这次的实验是完成火车厢重徘问题,依旧采用的检查用户的错误输入机制,充分考虑了用户的各种错误,比如输入的序列不是连续自然数,如果输入的车厢数有误的时候(为负数或零)等等的情况,完成了该次实验,主要出现的问题在于数组的下标问题,老是出现越界访问错误等等,这要在下次的实验当中多加注意!
本文标题:火车车厢重排问题,队列,c语言
链接地址:https://www.777doc.com/doc-4520282 .html