- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构车厢从组实验报告及源代码
数据结构实验报告
实验名称:
学生姓名:
班 级:
班内序号:
学 号:
日 期:
1.实验要求
掌握如下内容:
? 1、进一步掌握指针、模板类、异常处理的使用
? 2、掌握栈的操作的实现方法
? 3、掌握队列的操作的实现方法
? 4、学习使用栈解决实际问题的能力
? 5、学习使用队列解决实际问题的能力
利用队列结构实现车厢重排问题。车厢重排问题如下:
一列货车共有n节车厢,每个车厢都有自己的编号,编号范围从1~n。给定任意次序的车厢,通过转轨站将车厢编号按顺序重新排成1~n。转轨站共有k个缓冲轨,缓冲轨位于入轨和出轨之间。开始时,车厢从入轨进入缓冲轨,经过缓冲轨的重排后,按1~n的顺序进入出轨。缓冲轨按照先进先出方式,编写一个算法,将任意次序的车厢进行重排,输出每个缓冲轨中的车厢编号。
2. 程序分析
2.1 存储结构
为了实现对火车车厢的存储,方便以后的排序,在储存初始化的主轨道和副轨道的火车车厢时,采用了链队列的思想,将每个车厢视为一个结构体,该结构体中的两个元素分别为整形与指向这种结构体的一个指针。整形数代表主车厢的每个车厢的编号,而指针则指向下一个车厢。对于整个主轨道和缓冲轨,分别采用一个数组来存储它们的排序方式,即该轨道中列车的排序方式。但是每个轨道中列车的数量是不确定的,因此不能采用静态数组,必须采用动态数组,因此储存列车编号的数组是动态数组,通过对内存空间的申请使用来申请动态数组储存列车编号。
以下是主轨道和缓冲轨的存储结构示意图:
缓冲轨1:
缓冲轨2:
缓冲轨3:
、、、、、、
缓冲轨n:
另外,专门定义了一个结构体LinkQueue,对对象的操作进行统一的定义。比如出队入队操作,析构操作等。
2.2 关键算法分析
一:关键算法分析:
1:链队列的构造函数:
1:建立一个新的结点,
2:节点的next域指向空
3:将front结点和rear结点都指向该节点
2:链队列的析构函数:
1:建立一个指向头结点的指针
2:如果该节点不为空,再建立一个指针,指向该节点的next结点
3:释放该节点指向的内存空间
4:重复以上两步操作
3:链队列的入队操作函数
1:建立一个新结点
2:对该新结点的数据域和next域进行赋值,next赋为空
3:将rear指针的next域指向该新结点
4:该新结点赋给rear指针
4:链队列的出队操作函数
1:判断是否发生下溢
2:新建一个指针指向front的next域
3:将front的next域改为p的next域
4:如果p的next不为空,就释放p指针,否则将rear赋值为front
5:返回被析构的结点的数据域的值
5:遍历打印元素
1:建立一个指针,指向front的next域
2:输出该指针指向的结点的next域
3:如果该指针不是空的话,那么该指针继续指向下一个结点
6:将主轨道内的火车车厢开进缓冲轨的函数
1:将主轨道的最前面的元素入队
2:如果进入的该缓冲轨是空的话,那么是可以入队的
3:如果进入的缓冲轨不是空的,那么判断最近进入缓冲轨的车厢编号是否大于马上就要进入的车厢编号,如果大于,就不能进入,否则,可以进入
4:如果所有的缓冲轨都不满足以上条件,该函数结束,并且提示无法对车厢进行排序。
7、依次按1~n的顺序出轨。
cout车厢出轨次序为:endl;
for(int p=1;p=n;p++) //遍历依次输出
{
for(int q=0;qk;q++)
{
if(a[q].GetFront()==p)
couta[q].DeQueue() ;
}
}
二:代码详细分析
1:链队列的构造函数O(n)
1:建立一个指向Node的指针:NodeT *s=new NodeT;
2:将该指针的next域赋值为空:s-next=NULL;
3:将头指针和尾指针指向该节点front=rear=s;
Front Rear
S
2:链队列的析构函数O(n)
1:建立一个新指针指向头结点:NodeT *p=front;
2:如果该指针不为空:while(p!=NULL)
{
3:再建立一个指针指向p:NodeT *q=p;
4:将p指向p的下一个元素:p=p-next;
5:释放p指向的空间:delete q;
}
p
3:链队列的入队操作函数O(1)
1:建立一个指针:NodeT *s=new NodeT;
2:将该指针的data域赋值为x:s-data=x;
3:将该指针的next域赋值为空s-next=NULL
文档评论(0)