一.需求分析 1
约瑟夫环(Joseph)问题的一种描述是:编号为1,2„„,n 的n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1 开始顺序报数,报到m 时停止报数
报m 的人出列,将他的密码作为新的m 值,从他在顺时针方向上的下一个人开始重新从1 报数,如此下去,直至所有人全部出列为止
演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,有用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在其后
程序执行的命令包括: 1)输入初始密码和人数 2)输入所有人的密码 3)显示输入的所有人的编号及相应的密码 4)输出出列密码及编号 5)结束 4
测试数据 (1)m=20, n=7, 7 个人的密码依次为3,1,7,2,4,8,4 (2)m=20,n=1 (3)m=20,n=0 前面一组为常规数据,后面两组为边缘数据 二、概要设计 为实现上述功能,应以有序单向循环链表表示约瑟夫环
为此,需要有一个抽象数据类型
该抽象数据类型的定义为: ADT LinkList { 数据对象:D={ ai | ai ∈termset,i=1,2,„„n,n>=0} , termset 中每个元素包含编号,密码,和一个指向下一节点的指针 数据关系:R1={ | ai-1, ai ∈D , i=2,„„n} 基本操作: LinkList EvaluList(int n);//对单向循环链表进行尾插入赋值 int size(LinkList L);//求链表的节点个数 Status ScanList(LinkList L);//遍历单向循环链表 Status Joseph(LinkList &L,int m);//约瑟夫环的实现 } 此抽象数据类型中的一些常量如下:#d