火车车厢重排问题队列c语言.docx

上传人:b****5 文档编号:8136615 上传时间:2023-01-29 格式:DOCX 页数:12 大小:17.43KB
下载 相关 举报
火车车厢重排问题队列c语言.docx_第1页
第1页 / 共12页
火车车厢重排问题队列c语言.docx_第2页
第2页 / 共12页
火车车厢重排问题队列c语言.docx_第3页
第3页 / 共12页
火车车厢重排问题队列c语言.docx_第4页
第4页 / 共12页
火车车厢重排问题队列c语言.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

火车车厢重排问题队列c语言.docx

《火车车厢重排问题队列c语言.docx》由会员分享,可在线阅读,更多相关《火车车厢重排问题队列c语言.docx(12页珍藏版)》请在冰豆网上搜索。

火车车厢重排问题队列c语言.docx

火车车厢重排问题队列c语言

 

计算机科学与工程学院

 

《算法与数据结构》试验报告[一]

 

专业班级

10级计算机工程02

试验地点

计算机大楼计工教研室

学生学号

22

指导教师

蔡琼

学生姓名

肖宇博

试验时间

2012-4-21

 

试验项目

算法与数据结构

试验类别

基础性()设计性()综合性(√)

其它()

(1)掌握队列的特点及其存储方法;

(2)掌握队列的常见算法和程序实现。

 

成绩评定表

评分标准

分值

得分

上机表现

积极出勤、遵守纪律

30分

主动完成设计任务

程序与报告

程序代码规范、功能正确

70分

报告详实完整、体现收获

 

备注:

 

评阅教师:

日期:

 

年月日

 

试验内容

 

一、实验目的和要求

1、实验目的:

(1)掌握队列的特点及其存储方法;

(2)掌握队列的常见算法和程序实现。

2、实验内容:

火车车厢重排问题。

转轨站示意图如下:

H1

 

3

H

3

入轨

H2

 

963

1

581

H

H

入轨

3

出轨

742

H2

(a)将369、247依次入缓冲轨

96

H

1

5

54321

入轨

H3

出轨

87

H2

(c)将8入缓冲轨,5移至出轨

 

1

 

出轨

 

96

H1

58

4321

H

入轨

3

出轨

7

H2

(b)将1移至出轨,234移至

出轨

H

1

1

入轨

H3

出轨

 

H2

(d)将6789移至出轨

火车车厢重排算法伪代码如下:

 

1.分别对k个队列初始化;

2.初始化下一个要输出的车厢编号nowOut=1;

3.依次取入轨中的每一个车厢的编号;

如果入轨中的车厢编号等于nowOut,则输出该车厢;

nowOut++;

否则,考察每一个缓冲轨队列

for(j=1;j<=k;j++)

取队列j的队头元素c;

如果c=nowOut,则

将队列j的队头元素出队并输出;

nowOut++;

如果入轨和缓冲轨的队头元素没有编号为nowOut的车厢,则

求小于入轨中第一个车厢编号的最大队尾元素所在队列编号j;

如果j存在,则把入轨中的第一个车厢移至缓冲轨j;

如果j不存在,但有多于一个空缓冲轨,则把入轨中的第一个车厢移至一个空缓

冲轨;否则车厢无法重排,算法结束;

 

3、实验要求:

使用顺序存储队列的方式完成该实验。

二、设计分析

根据实验要求,采用队列来完成本次实验。

实验中定义了三个队列,一个用来存储输入的车厢号,另两个用来存储缓存出队顺序及序号。

三、源程序代码

#include<>

#include<>

 

#defineMax20

typedefstruct

{

intdata[Max];

intfront,rear;

}squeue;

 

voidinitqueue(squeue*&q)

{

q=(squeue*)malloc(sizeof(squeue));

q->front=q->rear=0;

}

 

voidenqueue(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;i<50;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++;

 

dequeue(w1);

 

}

elseif(gettop(w2)==nowout)

{

printf("%d号车厢出轨!

\t",gettop(w2));

nowout++;

dequeue(w2);

 

}

else

{

intc=gettop(q);

n1=getrear(w1);

n2=getrear(w2);

if(n1>n2)

{

if(c>n1)

{

enqueue(w1,c);

dequeue(q);

}

else

{

enqueue(w2,c);

dequeue(q);

 

}

}

else

{

if(c>n2)

{

enqueue(w2,c);

dequeue(q);

}

else

{

enqueue(w1,c);

dequeue(q);

 

}

 

}

}

 

}

}

 

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");gotolabel2;

}

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.倒输这几个数如图:

 

3.顺序输这个序列

 

4.如果输入的车厢数有误的时候(为负数或零)

 

5.如果输入的序列不是连续自然数

 

五、实验总结

先后学习了C/C++,对编程语言基本上有一些了解,但在数据结构试验程序设计过程中还是学到了很多。

经过两天的设计,在不断翻阅以前资料的情况下,有针对性的复习了C/C++

中指针、循环的相关理论知识和的基础知识和应用技巧,最后比较成功的完成

了本次的设计。

这次的实验是完成火车厢重徘问题,依旧采用的检查用户的错误输入机制,充分考虑了用户的各种错误,比如输入的序列不是连续自然数,如果输入的车厢数有误的时候(为负数或零)等等的情况,完成了该次实验,主要出现的问题在于数组的下标问题,老是出现越界访问错误等等,这要在下次的实验当中多加注意!

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

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1