Joseph环课程设计
目 录
1.需求分析说明
1.Joseph环的总体功能要求
2. 各功能模块的功能描述
3. 需要测试的数据
2.概要设计说明
1. 程序流程图
2. 模块调用图
3.详细设计说明
1. 主函数模块
2. 节点数据结构体定义模块
3.单向循环链表创建模块
4.结点删除模块
5.输入子模块
4.调试分析
5.用户使用说明
6.课程设计总结
7.测试结果
8.参考书目
一、需求分析说明
1. Joseph环的总体功能要求:
Joseph环的总体目标:在Microsoft Visual C++ 6.0 的开发环境下,利用所学C语言和数据结构的相关知识,编写约瑟夫环(Joseph)问题的程序,要求如下:
编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
(1)界面友好,易与操作。
(2)要求使用单向循环链表模拟过程
(3)输入报数上限值m和人数上限,密码,均限定为正整数,输入的形式为一个以“回车符”为结束标志的正整数。提供用户从键盘输入,Joseph约瑟夫环的必要数据,并显示出列顺序7
各成员密码:3 1 7 2 4 7 4
初始值m:20
2、总成员数n:7
各成员密码:3 1 7 2 4 7 4
初始值m:6
二、概要设计说明
1. 程序流程图
2. 模块调用图:
抽象数据类型的定义为:
ADT LinkList
{
数据对象:D={ ai | ai ∈termset,i=1,2,……n,n>=0},
termset中每个元素包含编号,密码,和一个指向下一节点的指针
数据关系:R1={ | ai-1, ai ∈D , i=2,……n}
}
基本操作:
status CreateList_Circle(member **,int);创建循环链表
status DeleteNode(member **);删除链表结点
此抽象数据类型中的一些常量如下:
typedef int status;
#define OVERFLOW -2
#define OK 1
#define ERROR 0
三、详细设计说明
1、主函数模块
调用各功能模块,实现单向链表循环、输入、输出等功能。
2.节点数据结构体定义模块
joseph环的组成成员由密码(password)和序号(No)组成,循环链表的存储结构如下:
typedef struct LNode
{
int password; //密码
int No; //序号
struct LNode *next; //下一成员指针
}member; //成员结构体
任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。status CreateList_Circle(member **p_head,int n)
{
int i;
member *tail,*p;
*p_head=(member *)malloc(sizeof(member));
if (!(*p_head)) return OVERFLOW;
(*p_head)->No=1; //储存成员一序号
printf ("请输入成员1的密码:\n");
scanf ("%d",&(*p_head)->password); //储存成员一密码
while((*p_head)->password<=0)
{
printf("请输入正值:");
scanf ("%d",&(*p_head)->password);
}
tail=*p_head;
tail->next=NULL;
for (i=2;i
{
p=(member *)malloc(sizeof(member));
if (!p) return OVERFLOW;
p->No=i; //储存成员序号
printf ("请输入成员%d