第一章 问题分析
1.1 设计目的
1、掌握单向循环链表的建立。 2、掌握单向循环链表的操作。
1.2 设计内容
编号是1,2,??,n的n个人按照顺时针方向围坐一圈,每个人
只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。请设计一个程序求出出列顺序。
1.3 设计要求1、利用单向循环链表存储结构模拟此过程,按照
出列的顺序输出各个人的编号。
2、测试数据:m的初值为20,n=7,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?
3、输入数据:建立输入函数处理输入的数据,输入m的初值n,输入每个人的密码,建立单向循环链表。
4、输出形式:建立一个输出函数,将正确的出列顺序输出。
1.4 设计思想
约瑟夫环问题描述的是:设编号为1,2,?,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。开始时选择一个正整数作为报数上限m,从第一个人开始顺时针方向自1起按顺序报数,报到m时停止报数,报m的人出圈,将他的密码作为新的m值,从他的顺时针方向上的下一个人起重新从1报数。如此下去,直到所有人都出圈为止。令n最大值为100。要求设计一个程序模拟此过程,求出出圈的编号序列。具体描述如图1和图2所示:图1 约瑟夫环问题
这这这这这这这这这这这这这这这这这这这这m这这这m=4这这这这这这这这这这这这4这4这这这这这这4这这9这这这这这这这这这这这这这1这2这3这5这6这7这8这9这0这34这这这这这这这这这这这这“1”这这这这这m这这这这m=3这这这这这这这这这3这10298这这这这这这这这这这这这这这这这这这这这m这这这m=9这这这这这这这这这这这这9这9这这这这这这9这这这这这这这这这这这这这这这这这这这这1这2这3这5这6这7这8这9这图解567t 这这这这这这这这1这这这13127324458 这这这这这这这这这这这这这这这这20这这这这这这这这20这这这6这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这4这这这这这这这这这这这这这这这这这这6这这这这这这这这这这这这这m=8这这7这这这这这这这这8这这这1这这这这64786312447127345
图2 约瑟夫环原理演示图
第二章 逻辑设计
2.1 循环链表抽象数据类型定义
typedef struct LNode//定义单循环链表中结点的结构 {
int num;//编号 int pwd;//password struct LNode *next;//指向下一结点的指针 }LNode;
2.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()
函数的调用关系图如图3所示:
Casel这这这这这这这这这这这这这这这这这这这这void instruction这这这这这这这这这这main这这这这这这这void emun这这Case2这这这这这这这这这这这这这这这这这这这这这createList这LNode**这这Head这int n这这这这这这这这这这这这这这这这这这这这这LNode*ppHead这int m-pwd这Case 0这default 这这0这这这exit这0这