约瑟夫环
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计
题目:约瑟夫环
班级: 121004 *名:***
学号: ********* 指导教师:
目录
一、前言
1.摘要
二、实验目的
三、题目—约瑟夫问题
1.问题描述
2.基本要求
3.测试数据
4.实现提示
四、需求分析
五、概要设计
六、详细设计
七、调试分析
八、心得体会与总结
九、附录
一、前言
1.摘要
约瑟夫环问题是典型的线性表的应用实例,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。
经过分析,我们使用MICROSOFT公司的Microsoft Visual C++6.0开发工具,利用其提供的各种面向对象的开发工具,尤其是数据窗口这一能方便而简洁操纵数据库的智能化对象,首先在短时间内建立系统应用原型,然后,对初始原型系统进行需求迭代,不断修正和改进,直到形成用户满意的可行系统。
二、实验目的
♦了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
♦提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
♦熟练掌握线性表的基本操作在单循环链表存储结构上实现。
三、题目—约瑟夫问题
约瑟夫环问题的一种描述的是:设编号为1,2,…,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一正整数密码。开始时选择一个正整数作为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出圈,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新从1报数。如此下去,直到所有人都出圈为止。令n最大值为100。要求设计一个程序求出出列序列。
2.基本要求:利用单循环列表存储结构模拟此过程,按照出列的顺序引出个人的编号。
3.测试数据:m的初值为20;n=7,7 个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序应该为6,1,4,7,2,3,5)
4.实现提示:程序运行后,首先要求用户指定初始报数上限值,然后读取个人的
密码。可设n<=30。
四、需求分析
♦题目;
♦实验目的;
♦需求分析:在该部分中叙述实现的功能要求;
♦概要设计:在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义);
♦详细设计:各个算法实现的源程序,对每个题目要有相应的源程序(可以是一组源程序,每个功能模块采用不同的函数实现)。源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量、重点功能部分要加上清晰的程序注释;
♦调试分析
测试数据,测试输出的结果,时间复杂度分析,和每个模块设计和调试时存在问题的思考(问题是哪些?问题如何解决?),算法的改进设想;
♦总结:设计过程的收获、遇到问题及解决问题过程的思考、程序调试能力的思考、对数据结构这门课程的思考、在设计过程中对《数据结构》课程的认识等内容。
五、概要设计
1、循环链表抽象数据类型定义
typedef struct LNode//定义单循环链表中节点的结构
{
int num;//编号
int pwd;//password
struct LNode *next;//指向下一结点的指针
}LNode;
2、本程序包含一下几个模块
(1)构造结点模块
LNode *createNode(int m_num,int m_pwd)
{
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()
函数的调用关系图如下:
六、详细设计
主函数main()
图4 主函数数据流程图
根据流程图,主函数程序如下:
int main()
{
int n,m,x;
LNode *ppHead=NULL;
menu();
for(;;){
printf("\n请选择要执行的操作:");
scanf("%d",&x);
system("cls");
switch(x){
case 1:
printf("*************************************************************** *\n");
printf("约瑟夫环:\n");
printf(" 编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人持有一个密\n");
printf("码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\n");
printf("按顺时针方向自1开始顺序报数,报到m时停止.报m的人出列,将他的密码\n");
printf("m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,\n");
printf("直到所有人全部出列为止.编程打印出列顺序.\n");
printf("*************************************************************** *\n");
main();
break;
case 2:
printf("\n请输入总人数n:");
scanf("%d",&n);
printf("请输入开始上限数m:");
scanf("%d",&m);
createList(&ppHead,n);
printf("\n");
printf("出队顺序:\n");
jose(ppHead,m);
printf("\n约瑟夫环游戏结束!\n");
main();
break;
case 0:
exit(0);
default:
system("cls");
printf("\n您选择的操作有误,请重新选择...\n\n\n");
main();
}
}
return 0;
}
1.链表的创建
创建单向循环链表ppHead,人数个数为n,并输入每个人的密码值,若建立