约瑟夫环模拟文档格式.docx
- 文档编号:19270404
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:13
- 大小:168.93KB
约瑟夫环模拟文档格式.docx
《约瑟夫环模拟文档格式.docx》由会员分享,可在线阅读,更多相关《约瑟夫环模拟文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
2.2.1功能模块图2
2.2.2流程图分析3
3数据结构分析7
3.1存储结构7
3.2算法描述7
4调试与分析8
4.1调试过程8
参考文献9
附录(关键部分程序清单)10
1课程设计介绍
1.1课程设计内容
由一个双向循环链表模拟m个人站成一个圈,输入一个数n,n>
0正向前进,n<
0逆向前进,当前人由1开始计数,每行进一个人,计数加1,数到|n|的人出圈,然后依原行进方向继续由1开始计数,重复上述过程,直到所有人都出圈,输出其出圈序列。
1.2课程设计要求
1)利用所学知识,设计相应的数据结构;
2)熟练运用开发环境;
3)完成软件的设计与编码;
4)熟练掌握基本的调试方法;
5)提交符合课程设计规范的报告。
2课程设计原理
2.1课设题目粗略分析
根据课设题目要求,将整体程序分为查找和删除两大模块:
1)在查找模块中,当输入的n的数值大于0时,链表正向循环且输出第n人所在位置并调用删除模块释放当前节点,直到所有人都出圈;
当输入的n值小于0时链表逆向循环且输出第n人所在位置并调用删除模块释放当前节点,直到所有人出圈。
2)删除模块负责将查找模块找到的当前人的节点进行删除并返回下一个人的位置。
2.2原理图介绍
2.2.1功能模块图
如图2.1所示为约瑟夫环模拟程序的功能模块图,函数包括查找模块和删除模块,主函数中调用了查找模块,查找模块中调用了删除模块。
图2.1功能模块图
2.2.2流程图分析
1)主程序是整个程序的核心部分,通过对子函数JosephLink的调用,完成整个程序,主函数流程图表示如图2.2所示:
图2.2主函数流程图
2)子函数JosephLink,主要功能为从当前人开始查找第到|n|个人的位置并输出第|n|个人所在位置,然后将第|n|个节点传入函数del_link,流程图如图2.3所示:
图2.3子函数JosephLink流程图
3)子函数del_link1,主要功能为将由函数JosephLink查找到的节点进行删除操作并将该节点的下一节点返回到函数JosephLink中,流程图如图2.4所示:
图2.4del_link1函数流程图
4)子函数del_link2,主要功能为将由函数JosephLink查找到的节点进行删除操作并将该节点的上一节点返回到函数JosephLink中,流程图如图2.5所示:
图2.5del_link2函数流程图
3数据结构分析
3.1存储结构
程序中主要用到的存储结构为双向循环链表,其存储结构体为:
typedefstructDulNode{
intdata;
structDulNode*prev;
structDulNode*next;
}DulNode;
该结构体包括数据域和前指针prev域与后指针next域。
3.2算法描述
1)创建双向循环链表,简单算法说明如下:
person=(DulNode*)malloc(sizeof(DulNode));
//为第一个节点申请空间
person->
data=1;
//data记录当前人的位置
next=person->
prev=person;
s=person;
for(i=2;
i<
=m;
i++){//创建m-1个节点
r=s;
s=(DulNode*)malloc(sizeof(DulNode));
s->
data=i;
prev=r;
//依次将新生成的节点插入循环链表中
r->
next->
prev=s;
next=r->
next;
next=s;
}
2)删除节点tmp的算法,如下所示:
tmp->
prev->
next=tmp->
//将tmp前一个节点的next指
//针指向tmp的下一个节点
prev=tmp->
prev;
//将tmp下一个节点的prev指针
//指向tmp的上一个节点
4调试与分析
4.1调试过程
在调试程序时主要遇到以下几个问题:
1)调试时发现在链表上删除节点之后无法继续将下一个节点作为开始来循环而且当输入的n的值为n的整数倍时无法正常输出出圈序列。
问题分析及解决办法:
专门创建一个删除函数,负责删除传入的节点并返回删除节点的下一节点,另外申请一个节点传入链表的表头。
2)当链表中节点只剩下一个的时候发现无法输出最后节点所在的位置。
在循环中添加一个判断条件,当链表中只剩唯一一个节点的时候单独输出节点所在的位置。
3)调试过程中发现在删除第一个节点之后链表不能继续前进n个位置并输出第n个位置的序列。
问题分析及解决办法:
在while循环里加入一个for循环来控制链表的每次前进和输出。
4)调试过程中发现程序运行时不能按照正常的顺序输出出圈序列,后经过多次细心调试及同学帮助才发现是全局变量和局域变量发生冲突而导致。
解决办法:
将全局变量和局域变量分别用不同的字母表示加以区分,经过调试后输出正常。
5运行结果
如图
参考文献
[1]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2007.
[2]吕英国.算法设计与分析[M].北京:
清华大学出版社,2006.
[3]徐宝文李志.C程序设计语言[M].北京:
机械工业出版社,2004.
[4]张长海,陈娟.C程序设计[M].北京:
高等教育出版社,2004.
[5]谭浩强.C程序设计[M].北京:
清华大学出版社,2005.
[6]张千帆.数据结构与算法(C语言实现)[M].北京:
科学出版社,2009
[7]徐宝文李志.C程序设计语言[M].北京:
机械工业出版社,2004
附录(关键部分程序清单)
程序代码
#include<
stdio.h>
stdlib.h>
DulNode*del_link1(DulNode*person,DulNode*tmp){//n>
0删除第n个节点并返回后一个节点信息
DulNode*s=tmp;
s=s->
free(tmp);
returns;
DulNode*del_link2(DulNode*person,DulNode*tmp){//n<
0删除第n个节点并返回前一个节点信息
voidJosephLink(DulNode*person,intm,intn){//查找并打印第n个节点
inti;
DulNode*tmp=person;
if(n>
0){
while(tmp->
next!
=tmp){
for(i=1;
n;
i++){
tmp=tmp->
}
printf("
%d"
tmp->
data);
tmp=del_link1(person,tmp);
printf("
%d\n"
else{
prev!
-n;
tmp=del_link2(person,tmp);
voidmain(){
DulNode*person,*s,*r;
inti,m,n;
请输入人数m:
\n"
);
scanf("
%d"
&
m);
请输入n的值:
n);
出圈序列为:
JosephLink(person,m,n);
课程设计总结:
通过这次数据结构课设我不仅巩固了以前所学的知识而且能够更好的运用到所编的程序当中去,尤其是链表方面在以前的学习过程中也是难点,但是经过这次课程设计后已经能够应用的融会贯通了,虽然编程过程遇到了很多的麻烦但是我相信在以后的工作当中这些经验绝对是一笔宝贵的财富。
在这次课程设计过程中也发现了自己的很多不足之处,因为知识面的束缚没有想的更深更远,所以以后一定要广泛涉猎,掌握更多更好的解决问题的方法。
此次的课程设计时间虽短但是却让我们获益匪浅,而且也让我们充分的认识到了平时练习的重要性,因为程序是脑力和体力相结合的产物,平时要是不多加练习是很难写出简洁高效的算法的。
本次课设中虽然遇到了很多困难,但是却得到了许多同学及老师的帮助,十分感谢这次课设过程中老师的耐心指导,还有在我遇到困难时细心帮助我的同学,使我在编程设计发面有所提高。
在今后的学习过程中,我一定要更加努力,使自己以后的编程技能步上新的台阶。
指导教师评语:
指导教师(签字):
年月日
课程设计成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 约瑟夫 模拟
![提示](https://static.bdocx.com/images/bang_tan.gif)