数据结构课程设计报告约瑟夫环完整版[1]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告约瑟夫环完整版[1]
*******************
实践教学
*******************
兰州理工大学
软件职业技术学院
2011年春季学期
算法与数据结构课程设计
题目:约瑟夫环
专业班级:
姓名:
学号:
指导教师:
成绩:
摘要
约瑟夫环问题是典型的线性表的应用实例,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。
经过分析,我们使用MICROSOFT公司的Microsoft Visual C++6.0开发工具,利用其提供的各种面向对象的开发工具,尤其是数据窗口这一能方便而简洁操纵数据库的智能化对象,首先在短时间内建立系统应用原型,然后,对初始原型系统进行需求迭代,不断修正和改进,直到形成用户满意的可行系统。
关键词:单循环链表;c语言;约瑟夫环;
目录
摘要 (1)
序言............................................................................. 错误!未定义书签。目录. (2)
正文 (1)
一、问题描述 (1)
二、逻辑设计 (2)
三、详细设计 (4)
四、程序代码 (10)
五、程序调试与测试 (10)
设计总结 (16)
参考文献 (17)
致谢 (18)
附录 (19)
正文
一、问题描述
约瑟夫环问题描述的是:设编号为1,2,…,n 的n (n>0)个人按顺时针方向围坐一圈,每个人持有一正整数密码。开始时选择一个正整数作为报数上限m ,从第一个人开始顺时针方向自1起顺序报数,报到m 时停止报数,报m 的人出圈,将他的密码作为新的m 值,从他在顺时针方向上的下一个人起重新从1报数。如此下去,直到所有人都出圈为止。令n 最大值为100。要求设计一个程序模拟此过程,求出出圈的编号序列。如下图分析: 1
2 3 4 5
6 7 8 9
0 这是第一个人,他的
密码是“1”,个他输
一个m 值,如果m=3,
则从他开始向下走3
个 这就是第二步的位置,这时他的密码作为新的m 值,即m=4,同时得到的第一个密码为
4;4号出去向下走4,到9这儿;(这这一步完了剩余的为:
1,2,3,5,6
,,
7,8,9,0,) 这就是第三步的位置,
这时他的密码作为新的
m 值,即m=9,同时得到
的第二个密码为9;9号
出去向下走9,到0这儿;
继续走就行了(这儿剩
余的就是:1,2,3,5,
6,7,8,0)
图1约瑟
二、逻辑设计
1、循环链表抽象数据类型定义
typedef struct LNode//定义单循环链表中节点的结构
{
int num;//编号
int pwd;//password struct LNode *next;//指向下一结点的指针 }LNode;
2、本程序包含一下几个模块
(1)构造结点模块
LNode *createNode(int m_num,int m_pwd) 3 2 7 1 4 8 4 约瑟夫环原理演示图
1 2 3 4 5 6 7 第二部:第一次停下的位置,此时6号出列,并将他的值作为新的m 值,即:新的m=8;从7好开始继续向下走8次,到1号的
位置
最后排序后的密码序列:
(本图只演示前两步) 8
第三步:
第二次,1号出列 第四步:第三次,4号出列 3 第一步:给第一个人
赋初始密码为:20则
从它开始向下走20
次,到6号位置 2 4 1 7 4 6 1 4 7 2
3 5 图 2 约瑟夫
{
LNode *p;
p=(LNode *)malloc(sizeof(LNode));//生成一个结点
p->num=m_num;//把实参赋给相应的数据域
p->pwd=m_pwd;
p->next=NULL;//指针域为空
return p;
}
(2)创建链表模块
void createList(LNode *ppHead,int n)
(3)出队处理模块
void jose(LNode *ppHead,int m_pwd)
(4)约瑟夫环说明输出模块
void instruction()
(5)菜单模块
void menu()
(6)主函数模块
int main()
函数的调用关系图如下:
三、详细设计
1. 主函数 Case 2:建立的约瑟夫环,并输出
输出该约瑟夫环的每个人的出列
图3 约瑟夫环函
菜单函数; 主函数
调用函Case 1:一个简单的输出函数,
Case
根据流程图,主函数程序如下:
int main()
{
int n,m,x;
LNode *ppHead=NULL; menu(); for(;;){
printf("\n 请选择要执行的操作:"); scanf("%d",&x); system("cls"); switch(x){ case 1:
printf("****************************************************************\n");
Main(Menu()功
功能1:
约瑟夫环说
功能2:按要求功能3:退出系
输入总输入开始输入每个玩
调用:
createList(&pp 选择
程序运行完,自
图 4 主函数