二、 概要设计
1、 问题的抽象数据类型分析
约瑟夫环的数据元素是由编号和密码值组成的二元组。约瑟夫环的逻辑结构是线性表。
求解约瑟夫环问题可以分为两个步骤:
1. 构造约瑟夫环;
2. 约瑟夫环循环报数、出列。
在第一个步骤,由于构造约瑟夫环是通过在表尾循环插入元素结点,因此约瑟夫环的逻
辑操作有:
1. 初始化约瑟夫环;
2. 在约瑟夫环表尾插入;
3. 循环报数出列。
通过以上分析,确定约瑟夫环抽象数据类型定义如下:
ADT JesephRing
数据元素: a
i
=(n
i
,m
i
),i=0,1,…,n-1 (n≥0),n
i
,m
i
代表第 i 个人的编号和持有的密码 ,其
中 n
i
不能省略。
结构:线性结构,对数据元素 a
i
(0≤i≤n-2)存在次序关系<a
i
,
a
i+1
>, a
0
的直驱是 a
n-1
,a
n-1
的
直继是 a
0
。
逻辑操作:设 J 为 JesephRing 型
JesephRingInitiate(J); //构造一个空的约瑟夫环 J。
JesephRingInsertEnd(J, x); //在约瑟夫环 J 尾部插入新元素 x ,成功返回 1,失败返回 0。
JesephRing(J,m); /*给定初始报数上限 m,从 1 开始循环报数、删除、输出直至 J 为空,
得到出列序列。*/
2、 存储结构设计
1、存储结构的确定
数据结构的目的是有效组织和处理数据。为了有效组织和处理数据,先要分析约瑟夫环
逻辑操作的特点和指针所占空间比例,然后确定最优的存储结构。
a) 确定采用顺序存储结构还是采用链式存储结构
1. 约瑟夫环在构造时频繁执行插入操作,在出列阶段频繁执行删除操作。
2. 如果采用链表,指针存储开销和整个结点内容所占空间相比,其比例较小
综上所述,认为不采用顺序表,而采用链表。
b) 选择哪种链式存储结构?
1. 约瑟夫环在构造时都是在尾部插入,因此增设尾指针,尾指针始终指向链表的
尾部结点。 通过增设尾指针,在表尾插入的算法时间复杂度为 O(1)。
2. a
0
的直驱是 a
n-1
,a
n-1
的直继是 a
0
,因此采用循环单链表。
综上所述,采用带尾指针的循环单链表存储结构。
2、设计带尾指针的循环单链表
a) 结构描述