数据结构课程设计任务书.docx
《数据结构课程设计任务书.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计任务书.docx(11页珍藏版)》请在冰豆网上搜索。
数据结构课程设计任务书
课程设计(论文)任务书
软件 学院 软件工程 专业 2013-1 班
一、课程设计(论文)题目 数据结构课程设计车厢调度
二、课程设计(论文)工作自2014年9月24日起至2014年10月8日止。
三、课程设计(论文)地点:
创新大楼
四、课程设计(论文)内容要求:
1.本课程设计的目的
(1)使学生熟练掌握抽象数据类型的组织和定义;
(2)使学生熟练掌握数据类型的定义和实现;
(3)培养学生组织和分析数据的能力;
(4)培养学生分析和应用基于不同数据结构的算法的能力;
(5)提高学生的科技论文写作能力。
2.基本要求:
每位同学在以下题目中任选一题(在方框中打勾),独立完成课程设计:
□击鼓传花:
编号为1,2,……,n的n个人按顺时针方向围坐一圈。
一开始第一个人
持有一个“花”,然后按顺时针方向自1开始顺序传递“花”,经过m个人(m是随机数)
后停止。
访问停止时,持有“花”的人必须输出一条信息:
“名字:
Igottheflower”。
随
后从此人开始继续按顺时针方向传递“花”……直到游戏结束。
□全国交通咨询模拟:
参见《数据结构题集》P153。
□车厢调度:
参见《数据结构题集》P98。
3.课程设计论文编写要求
(1)要按照书稿的规格打印誊写课设报告;
(2)报告分为封面、任务书(本文档)、正文、课程设计体会和参考文献四部分;
学生签名:
年月日
课程设计(论文)评审意见
(1)题目分析(20分):
优( )、良( )、中( )、一般( )、差( );
(2)流程分析 (30分):
优( )、良( )、中( )、一般( )、差( );
(3)数据定义 (30分):
优( )、良( )、中( )、一般( )、差( );
(4)代码编写 (10分):
优( )、良( )、中( )、一般( )、差( );
(5)创新能力 (10分):
优( )、良( )、中( )、一般( )、差( );
(6)格式规范性、设计态度及考勤是否降等级:
是( )、否( )
评阅人:
职称:
讲师
2014年1月6日
正文
一、数据结构定义
1.抽象数据类型
本设计中用到的数据结构ADT定义如下:
ADTStack{
数据对象:
D={
∈CharSet,i=1,2,...,n,,n≥0}
数据关系:
R1={<
∈D,i=2,...,n}
基本操作:
InitStack(&S)
操作结果:
构造一个空栈S。
DestroyStack(&S)
初始条件:
栈S已存在。
操作结果:
销毁栈S。
ClearStack(&S)
初始条件:
栈S已存在。
操作结果:
将栈S清为空栈。
StackLength(S)
初始条件:
栈S已存在。
操作结果:
返回栈S的长度。
StackEmpty(S)
初始条件:
栈S已存在。
操作结果:
若S为空栈,则返回TURE,否则返回FALSE。
GetTop(S,&e)
初始条件:
栈S已存在。
操作结果:
若S不空,则e返回栈顶元素。
Push(&S,&e)
初始条件:
栈S已存在。
操作结果:
在s的栈顶插入新的栈顶元素e。
Pop(&S,&e)
初始条件:
栈S已存在。
操作结果:
删除S的栈顶元素,并以e返回其值。
StackTraverse(S,visit())
初始条件:
栈S已存在。
操作结果:
从栈底到栈顶依次对S中的每个元素调用函数visit()。
}ADTStack
2.存储结构定义
数据存储结构的C语言定义如下:
栈类型;
typedefstructstacklist
{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
3.基本操作
数据结构的基本操作实现如下:
栈的基本操作设置如下:
voidStack_init(SqStack*s)//初始化,设s为空栈
voidStack_Push(SqStack*s,SElemTypee)//若分配空间成功,则在s的栈顶插入新的元素e,并返回TRUE
//若栈不变,并返回FALSE
SElemTypeStack_Pop(SqStack*s)
StatusStack_Empty(SqStack*s)
StatusStack_Full(SqStack*s)
voidStack_printreverse(SqStacks)
voidsearch(SqStack*inputPoint,SqStack*tempPoint,SqStack*outputPoint)
二、解题过程
1.问题分解
该问题主要应实现以下功能:
1输入要调度的车厢总数n
2计算出所有的出栈序列
3输出所有可能的序列
2.模块结构
系统主要由2个模块组成,分别是:
1)主程序模块:
Voidmain()
{
初始化;
For循环
}
2)栈模块——实现栈的抽象数据类型
模块之间的结构如下:
主程序模块
栈模块
3.解题思路
各模块的实现步骤为
为了使车厢能够调度,需要定义一个栈,利用栈先进后出的性质,改车厢的顺序。
对栈的抽象数据类型进行定义
存储情况如下:
函数流程图如下:
三、实现
代码及注释
#include
usingnamespacestd;
typedefintSElemType;
typedefintStatus;
intend;/*最后一个车厢的号码*/
longtotal=0;/*总的组合方案数目*/
typedefstructstacklist
{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
voidStack_init(SqStack*s)
{
s->base=(SElemType*)malloc(end*sizeof(int));
if(!
s->base)exit(0);
s->top=s->base;
s->stacksize=end;
}
voidStack_Push(SqStack*s,SElemTypee)
{
*(s->top)++=e;
}
SElemTypeStack_Pop(SqStack*s)
{
if(s->top==s->base)
return0;
return*(--(s->top));
}
StatusStack_Empty(SqStack*s)
{
if(s->top==s->base)
return1;
return0;
}
StatusStack_Full(SqStack*s)
{
if(s->top-s->base==end)
return1;
return0;
}
voidStack_printreverse(SqStacks)
{
int*po;
po=s.base;
printf("\t[%ld]:
",total);
for(;po!
=s.top;)
printf("%d",*po++);
printf("\n");
}
voidsearch(SqStack*inputPoint,SqStack*tempPoint,SqStack*outputPoint)
{
if(!
Stack_Empty(inputPoint))
{
Stack_Push(tempPoint,Stack_Pop(inputPoint));
search(inputPoint,tempPoint,outputPoint);
Stack_Push(inputPoint,Stack_Pop(tempPoint));
}
if(!
Stack_Empty(tempPoint))
{
Stack_Push(outputPoint,Stack_Pop(tempPoint));
search(inputPoint,tempPoint,outputPoint);
Stack_Push(tempPoint,Stack_Pop(outputPoint));
}
if(Stack_Full(outputPoint))
{
total++;
Stack_printreverse(*outputPoint);
}
}
主函数:
voidmain()
{
SqStackinput,temp,output;
inti;
printf("\n\n\t\t\t\t车厢调度\n");
printf("\n\t请输入车厢长度:
");
scanf("%d",&end);
/*初始化三个栈*/
Stack_init(&input);
Stack_init(&temp);
Stack_init(&output);
/*将车厢号码进栈*/
for(i=end;i>=1;i--)
Stack_Push(&input,i);
search(&input,&temp,&output);
}
四、实验结果
1.实验数据
输入3输入4
2.实验结果
五、实验小结
1.数据结构使用小结
本程序的栈其实也是一个简单的数组,它存储先后进入该栈的数,然后输出各个不同的序列。
由于此程序比较简单明了,不是很复杂,按照概要设计来进行代码设计的时候基本没有什么问题。
在调试过程中,主要是在主要的递归函数设计过程中遇到了不小的麻烦,二者主要的原因就在于对递归的调用算法没有钻研所致,在此过程中借助于课本上以及网上查到的关于递归的资料才算勉强完成这个函数。
2.需完善之处
还有许多的细节需要去完善调整,比如把界面做的更加简洁美观和人性化~同时要注意避免许多的意外情况,要满足一些比较刁钻的数据!
同时也要排除那些错误的指令,这些都要一颗细心的心去完善程序。
课程设计体会
通过这次课程设计,我对于将课本上的知识运用到实际生活中的整个过程深有体会了,不像之前对知识单纯的停留在课本及考试的要求上。
对于我们学过的知识,我们要尽量深入而透彻地去理解以及渗透,因为,在我看来,只有充分的了解渗透才能更好的将课本所学的知识运用到实验和生活中去。
这次课程设计,我受益匪浅。
感谢老师的辛勤指导。
参考文献
1.《C++面向对象程序设计》——谭浩强
2.《软件工程》——汤文亮
3.《计算机导论》——王志强