数据结构课程设计报告.docx
《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/29/321a47ea-ac18-4b3c-9d87-0da8fe8d508d/321a47ea-ac18-4b3c-9d87-0da8fe8d508d1.gif)
数据结构课程设计报告
沈阳航空航天大学
课程设计报告
课程设计名称:
数据结构课程设计
课程设计题目:
学生搭配问题
院(系):
****
专业:
****
班级:
****
学号:
****
姓名:
****
指导教师:
****
目录
第1章算法分析及概要设计1
1.1程序设计的内容和要求1
1.1.1程序设计内容1
1.1.2程序设计要求1
1.2算法分析1
1.2.1需求分析1
1.2.2算法设计思想1
1.3系统功能模块结构图2
第2章详细设计3
2.1主要函数的使用与描述3
2.2功能模块流程图3
2.2.1主模块流程图3
2.2.2创建链队列流程图4
2.2.3配对输出函数流程图5
2.2.3配对查找函数流程图6
第3章调试分析7
3.1程序设计中出现的错误及解决办法7
3.2调试的结果7
第4章用户使用说明9
4.1进入系统操作界面9
4.2用户输入数据界面9
4.3配对输出情况界面10
4.4配对查找输出界面10
4.5退出系统界面11
参考文献12
附录(关键部分程序清单)13
第1章算法分析及概要设计
1.1程序设计的内容和要求
1.1.1程序设计内容
一班有m个男生,有n个女生(m不等于n),现要开一个舞会.男女生分别编号坐在舞池的两边的椅子上.每曲开始时,依次从男生和女生中各出一人配对跳舞,本曲没成功配对者坐着等待下一曲找舞伴.
1.1.2程序设计要求
1.输出每曲的配对情况;
2.计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞情况.
1.2算法分析
1.2.1需求分析
核心问题:
循环队列的应用
数据模型(逻辑结构):
循环队列(两个),将男生、女生两组人分别存放,以实现循环配对输出.
存储结构:
循环链表
核心算法:
循环队列的建立、入队、出队等.
输入数据:
男生人数、女生人数,歌曲数量以及查找编号.
输出数据:
每一首歌曲播放时,男生和女生搭配情况;当要查找男女搭配时输出歌曲编号和他们搭配的情况.
通过以上分析,该程序具有可行性.
1.2.2算法设计思想
队列是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。
(1)用单链表存储结构建立两个循环队列,链表结点的数据域依次分别存放男女生编号,以实现循环队列输出.
(2)同时用两个指针front1和rear1指向队1链表的链头和链尾位置,front2和rear2指向队2链表的链头和链尾位置。
(3)循环队列的长度分别设为男生和女生的个数。
(4)利用循环队列的特性,将男女生分别依次进行入队列和出队列操作,实现搭配输出。
(5)在计算机终端输出的结果是:
根据要求输出男生女生搭配情况。
1.3系统功能模块结构图
本程序主要分为三个模块(功能模块见图1.3):
主模块,配对情况输出模块,配对查找模块。
主模块:
即主函数,提示用户输入数据。
配对输出模块:
调用出队和入队操作,实现编号循环配对输出。
配对查找函数:
利用出队和入队提取数据比较,输出所要查找的内容。
图1.3系统功能模块
第2章详细设计
2.1主要函数的使用与描述
主要数据类型:
整型、字符型、结构体指针。
主要函数有:
主函数(main函数),配对输出函数(display函数),配对查找函数(charge函数),创建链队列函数(InitLQueue函数),出队函数(Dequeue函数),入队函数(Enqueue函数)。
创建链队列函数(InitLQueue函数):
静态建立两个存储链表,分别用来存储男队和女队编号情况,其中链表长度分别为男女生人数,链表表头是队头,链表表尾是队尾。
配对输出函数(display函数):
建立男女生循环队列后,利用出队函数让男队和女队依次各出一个人跳舞,输出配对编号,跳完舞后男女生再次进入队列等待下一次跳舞。
配对查找函数(charge函数):
提示用户输入查找编号后,男队和女队循环依次出队,用count记录循环次数(即记录他们在第几首歌跳舞),比较出队编号和查找编号是否一致,如果一致,输出配对情况。
当输入过大时,系统会提示输入过大,请重新输入。
出队函数(Dequeue函数):
利用指针移动实现数据移动,取完指向元素后,将头指针移向下一个结点位置,相当于全体队员向前移动一位。
入队函数(Enqueue函数):
将尾指针移向头指针所指元素,相当于出队的那个元素进入队尾,等待下一轮跳舞。
2.2功能模块流程图
2.2.1主模块流程图
主函数控制着整个程序的运行,提示用户输入男女生的队列人数和歌曲长度,通过调用函数实现各个功能。
主模块功能流程图如图2.1所示。
图2.1主模块流程图
2.2.2创建链队列流程图
静态建立两个存储链表,以存储男队和女队编号情况,其中链表长度分别为男女生人数,链表表头是队头,链表表尾是队尾,流程图如图2.1所示。
图2.2创建队列模块流程图
2.2.3配对输出函数流程图
男女生依次出队跳舞,输出配对跳舞学生编号,流程图如图2.2所示。
图2.3配对输出模块流程图
2.2.3配对查找函数流程图
男女生循环依次出队,用count记录他们在第几首歌跳舞,比较出队编号和查找编号是否一致,如果一致,输出配对情况,流程图如图2.4所示。
图2.4配对查找模块流程图
第3章调试分析
3.1程序设计中出现的错误及解决办法
1.该程序的核心问题是循环队列的应用,在主函数程序设计的过程中,完成队列查找操作以后,判断用户是否继续执行查找操作时,当用户输入n,循环没有结束,而是继续执行查找操作,变成了死循环。
原因:
在用户输入字符n后,系统又将回车读入程序,使while循环的判断语句quit!
='n'始终成立,造成死循环,解决方法,加入getchar()操作即可读掉回车。
2.该程序是使用链表建立的循环队列,在创建链表的过程中,只是单独地建立了一个链表存储数据,获取队尾是遍历链表得到链尾的结果,而可以直接设置两个全局变量指针,在建立链表的过程中,用rear指针指向链表表尾。
3.该程序是利用形参和实参相互传递指针来实现队列循环的,出队和入队只是指针的前移或后移,从而实现数据的动态变化,但是在编写入队操作时,原代码是rear->next=front;运行结果总显示在一组数据上,并没有实现循环。
原来队列的循环操作还得按照实际来定,不能按照书本硬搬,将语句改成rear=front;后,输出结果才达到需求。
4.程序在执行第一个需求时运行正常,但是在执行第二个需求时打印结果总是杂乱无序,原因是在执行第一个需求后全局指针的头指针和尾指针已经变得面目全非了,这时再进行第二个操作时难免会出错。
只需在进行第二个操作之前进行归零操作,即用两个指针记录原指针初始位置,使用时即可重新归零。
3.2调试的结果
编译完毕,运行程序,此调试仅演示了部分功能,详细操作见第四章用户使用说明。
用户运行程序后,系统提示用户输入人数和歌曲数目,假如用户输入男生4人女生3,歌曲数目5,系统显示结果如下:
请分别输入男生和女生的人数(假设男生人数大于女生人数):
4,3
请输入歌曲数目:
5
每首歌曲的配对情况为:
在第1首歌1号男生和1号女生搭配跳舞
在第2首歌2号男生和2号女生搭配跳舞
在第3首歌3号男生和3号女生搭配跳舞
在第4首歌4号男生和1号女生搭配跳舞
在第5首歌1号男生和2号女生搭配跳舞
请输入查找男生和女生编号:
1,2
在第5首歌1号男生和2号女生搭配跳舞
是否继续(是请输入'y',否则请输入'n'):
如果用户继续查找操作,则输入y,否则输入n,当输入n时,整个程序运行结束,按任意键退出系统。
第4章用户使用说明
4.1进入系统操作界面
用户双击运行程序,系统弹出如下界面,提示用户输入男女生人数。
图4.1初始界面
4.2用户输入数据界面
例如:
用户输入男生5人,女生3人,屏幕显示结果如图4.2所示。
图4.2输入数据界面
4.3配对输出情况界面
当用户输入歌曲数目为:
6,显示界面结果如图4.3所示。
图4.3配对输出界面
4.4配对查找输出界面
如果用户输入查找编号:
11,显示界面如图4.4所示。
图4.4查找输出界面
4.5退出系统界面
如果用户输入y,系统会提示用户继续输入查找编号,进行查找操作。
如果输入n,退出整个系统程序。
显示界面如图4.5所示。
图4.5退出系统界面
参考文献
[1]谭浩强,《C程序设计》.北京:
清华大学出版社,2005.
[2]严蔚敏,吴伟民.《数据结构(C语言版)》.北京:
清华大学出版社,2008.
[3]张长海,《C程序设计》.高等教育出版社,2004.
[4]杨晓光,李兰友.《数据结构实例教程》.北京:
清华大学出版社,北京交通大学出版社,2008.
附录(关键部分程序清单)
#include
#include
#defineNULL0
intsongnum=0;//定义歌曲的数量并初始化为0
intm=0,n=0;//定义男女生的人数并初始化为0
structQNode*front1,*rear1,*front2,*rear2;
structQNode*sfront1,*srear1,*sfront2,*srear2;//记录对头队尾位置
structQNode//结点结构体
{
intdata;
structQNode*next;
};
voidInitLQueue(intm,intflag)//创建链队列
{
inti;
structQNode*p,*q;
if(flag==1)
{
front1=(QNode*)malloc(sizeof(QNode));
front1->data=1;
p=front1;
sfront1=front1;
for(i=2;i<=m;i++)
{
q=(QNode*)malloc(sizeof(QNode));
q->data=i;
p->next=q;
p=q;
}
rear1=p;
rear1->next=front1;
srear1=rear1;
}
else
{
front2=(QNode*)malloc(sizeof(QNode));
front2->data=1;
p=front2;
sfront2=front2;
for(i=2;i<=m;i++)
{
q=(QNode*)malloc(sizeof(QNode));
q->data=i;
p->next=q;
p=q;
}
rear2=p;
rear2->next=front2;
srear2=rear2;
}
}
voidEnqueue1()//进队
{
rear1=front1;
}
voidEnqueue2()
{
rear2=front2;
}
structQNode*Dequeue1()//出队
{
structQNode*p;
p=front1;
front1=front1->next;
return(p);
}
structQNode*Dequeue2()
{
structQNode*p;
p=front2;
front2=front2->next;
return(p);
}
voiddisplay(intm,intn)//输出每曲配对情况
{
intk;
printf("请输入歌曲数量:
");
scanf("%d",&songnum);
printf("每首歌曲的配对情况为:
\n");
InitLQueue(m,1);
InitLQueue(n,0);
for(k=1;k<=songnum;k++)
{
structQNode*x,*y;//男生和女生的编号指针
x=Dequeue1();//男生按顺序出对跳舞
y=Dequeue2();//女生按顺序出对跳舞
printf("在第%d首歌%d号男生和%d号女生搭配跳舞\n",k,x->data,y->data);
Enqueue1();//跳完舞后男生再次进入队列等在下一次跳舞
Enqueue2();//跳完舞后男生再次进入队列等在下一次跳舞
}
}
voidcharge(inta,intb)//查找跳舞情况
{
intcount=1;//用来记录他们能在第几首歌时一起跳舞
while(count<=songnum)
{
structQNode*x,*y;
x=Dequeue1();
y=Dequeue2();
Enqueue1();
Enqueue2();
if((x->data==a)&&(y->data==b))
{
printf("在第%d首歌时%d号男生和%d号女生一起搭配跳舞\n",count,a,b);
break;
}
count++;
}
if(count==songnum+1)//如果他们在这个舞会上不能在一起跳舞,则输出
printf("他们在这个舞会上不可能在一起跳舞");
}
voidmain()
{
printf("请分别输入男生和女生的人数(假设男生人数大于女生人数):
\n");
scanf("%d%d",&m,&n);
display(m,n);
inta=0,b=0;//记录男女生编号,以判断他们在第几首歌时能在一起跳舞
charquit='y';//判断是否继续输入
while(quit!
='n')
{
printf("请输入男生和女生的编号:
");
scanf("%d%d",&a,&b);
while((a>m)||(b>n))//判断是否输入错误
{
printf("你输入的编号过大,请重新输入:
");
scanf("%d%d",&a,&b);
}
front1=sfront1;//归零对头队尾指针
rear1=srear1;
front2=sfront2;
rear2=srear2;
charge(a,b);
printf("是否继续(是请输入'y',否则请输入'n'):
");
getchar();//读掉回车符
scanf("%c",&quit);
}
}
课程设计总结:
通过这两周的学习和实践,解决实际问题(学生搭配问题),让我对循环队列有了更深的了解,也让我提高了解决实际问题的能力。
我们要不断的通过上机来提高自己的学习水平,在上机的同时改正了自己对某些算法的错误使用,使自己在通过程序解决问题时抓住关键算法,有了算法设计思想和流程图,并用C语言描绘出关键算法。
在这次课程设计的实验中,我收获了许多知识,通过查找大量资料,请教老师,以及不懈的努力,也培养了独立思考、动手操作的能力。
我也学会了许多解决实际问题的方法,让我受益匪浅。
课程设计对我来说,趣味性强,不仅锻炼能力,而且可以学到很多东西,在与同学的交流过程中,互动学习,将知识融会贯通,也增强了我和同学之间的团队合作的能力。
让我们知道只要努力,集中精力解决问题,一定会有收获的,过程也是很重要的。
通过此次的实践,我也意识到了自身的不足。
有些函数的功能像出队和入队操作不能照书旧搬,而是要根据实际情况编写,因为自己在实际编写的过程更能理解他的含义。
所以今后一定要在实践中努力提升自己的程序编写能力、系统开发水平。
俗话说:
学无止境。
课程设计虽然结束了,但是我知道,作为计算机专业的人,以后还有很长的路要走。
当今的计算机技术发展更新的速度极快,我们必须不断的学习、提升才能跟上时代前进的步伐,才能更好的掌握这门技术,才能在当今社会的大环境下生活下去。
指导教师评语:
指导教师(签字):
年月日
课程设计成绩