- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PAGE \* MERGEFORMAT
PAGE \* MERGEFORMAT 1
数据结构
课程设计报告
设计课题: 约瑟夫问题
院 系: 计算机科学与技术学院
专业班级: 计算机网络技术1102班
学生姓名: 张 利
学 号: 1 1 0 8 0 4 0 2 1 1
指导教师: 王 昱 哲
目 录
TOC \o 1-2 \h \z \u HYPERLINK \l _Toc232777993 1.需求分析 3
HYPERLINK \l _Toc232777994 1.1问题描述 3
HYPERLINK \l _Toc232777995 1.2功能分析 4
HYPERLINK \l _Toc232777996 2.概要设计 5
HYPERLINK \l _Toc232778000 3.详细设计 6
HYPERLINK \l _Toc232778004 4.调试与操作说明 1 PAGEREF _Toc232778004 \h 5
HYPERLINK \l _Toc232778007 总 结 16
一.需求分析
1.1问题描述
约瑟夫环问题描述的是:设编号为1,2,…,n的n(n0)个人按顺时针方向围坐一圈,每个人持有一正整数密码。开始时选择一个正整数作为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出圈,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新从1报数。如此下去,直到所有人都出圈为止。令n最大值为100。要求设计一个程序模拟此过程,求出出圈的编号序列。如下图分析:
1
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约瑟夫环问图解
3
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 约瑟夫环原理演示图
1.2功能分析
约瑟夫环问题是一个古老的数学问题,本次课题要求用程序语言的方式解决数学问题。此问题仅使用单循环链表就可以解决此问题。而改进的约瑟夫问题通过运用双向循环链表,同样也能方便地解决。
在建立双向循环链表时,因为约瑟夫环的大小由输入决定。为方便操作,我们将每个结点的数据域的值定为生成结点时的顺序号和每个人持有的密码。进行操作时,用一个指针current指向当前的结点,指针front始终指向头结点。然后建立双向循环链表,因为每个人的密码是通过rand()函数随机生成的,所以指定第一个人的顺序号,找到结点,不断地从链表中删除链结点,直到链表剩下最后一个结点,通过一系列的循环就可以解决改进约瑟夫环问题。
概要设计
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)约
文档评论(0)