课程设计(约瑟夫环)[1]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
课程名称:数据结构课程设计课程设计题目:约瑟夫环问题
姓名:余明旭
系:计算机科学与技术专业:计算机科学与技术年级:2010级
学号:100310236
指导教师:陈老师
职称:学生
一、需求分析
1、输入的形式和输入值的范围:
本程序中,输入报数上限值n,初始报数者s,初始报数者携带的密码m1,n-2个人携带的密码m(最后一人携带的密码没用),均限定为正整数,输入的形式为一个以“回车符”为结束标志的正整数。
2、输出的形式:
从屏幕显示出列顺序。
3、程序所能够达到的功能:
提供用户从键盘输入,Joseph约瑟夫环的必要数据,并显示出列顺序。4、测试数据:
输入
8
1
4
4 4 4 4 4 4
输出
4 8
5 2 1 3 7 6
一、详细设计
以单向循环链表实现该结构:
1、抽象数据类型的定义为:
struct LNode
{
ElemType data;
LNode* next;
};
2、本程序包含以下模块:
主程序模块:
Void main()
{
初始化;
输入数据;
执行功能;
显示结果;
}
各功能模块:实现单链表的各项功能。
Void fun()
{
}
3、各模块的调用关系:
三、调试分析
程序的编写和调试基本正常,遇到的问题主要是:指针的指向的边界问题,如何每次正确找到出列的人的位置。 解决方法:
for(int j=1;j { ap=cp; cp=cp->next; if(cp==HL) { ap=HL; cp=HL->next; } } a[i]中存储了每个人的密码,就可以准确知道每个人的位置。 通过约瑟夫环算法的课题设计让我理解了循环队列,不单单只是书本上文字的循环队列的概念,更多是自己能够通过实际的操作对循环队列有了更深的了解。上机的编程的过程是对数据结构的基础的进一步的巩固。学习过程体验到了学习的乐趣,实验课题使我认识到平时学习的漏洞和知识的缺乏,为以后的学习敲了一下警钟,数据结构是门基础,要学习扎实才行。 数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。 数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安 排。数据结构是数据存在的形式。 数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。数据结构课程的主要目的是介绍一些常用的数据结构,阐明数据结构内在的逻辑关系,讨论它们在计算机中的存储表示,并结合各种数据结构,讨论对它们实行的 各种运算的实现算法。很多算法实际上是对某种数据结构施行的一种变换,研究算法也就是研究在实施变换过程中数据结构的动态性质。 学习的过程需要合作,而且在合作中提到自己的编程水平,借鉴他人好的地方,改掉原先自己不足,书本知识的与实际的联系,使自己的编程不在局限于原来的纸上谈兵,更多的是积累了经验,培养了能力。 四、用户手册 如何使用,详细步骤,根据提示输入。 示例: 主程序 Void main() 模块 Viod fun() 五、测试结果 六、附录带注释的源程序 #include typedef int ElemType; #define N 100 struct LNode { ElemType data; LNode* next; }; void fun(int n,int s,int a[N]) { LNode *HL=new LNode; //生成的结点带有头结点,此时循环单链表为空 HL->next=HL; int i; for(i=n;i>=1;i--) //生成带有n个结点的循环单链表 { LNode *r=new LNode; //生成新的结点 r->data=i; r->next=HL->next; //把新的结点插入到表头 HL->next=r; } LNode *ap=HL; LNode *cp=HL->next; for(i=1;i { //从表头开始顺序查找出第一个开始报数的人 ap=cp; cp=cp->next; if(cp==HL) { ap=HL; cp=HL->next; } } for(i=1;i { //顺序查找出待出列的人 for(int j=1;j { ap=cp; cp=cp->next; if(cp==HL) { ap=HL; cp=HL->next; } } cout< ap->next=cp->next; delete cp;