1.约瑟夫环问题
编号为1,2…n的人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。开始任选一个整数作为报数上限m,从第一个人顺时针自1开始顺时针报数,报到m时停止报数。报到m的人出列,将他的密码作为新的m值,从他顺时针方向上的下一个人开始重新从1报下去,如此下去,直到所有的人全部出列为止。
例如,m的初值为20;n=7,7个人的密码依次是3,1,7,2,4,8,4。求出列的顺序。
2.问题分析
1.要实现报数,必须有一个数来计数,判断是否到m。
2.出列,用单链表实现即将此节点从单链表中删除。所以,必须有两个指针,一个指向当前节点,一个指向当前节点的上一个节点。删除操作主要用这两个节点来完成。
模拟图如下,第一个数字为序号,第二个数字为密码
3.C语言实现
C语言实现,采用不带头结点的循环单链表实现,因此我们需要一个头指针来指明链表的开始,又因为要循环,所以需要一个尾指针来指明链表的尾。
1.以下为初始化循环单链表的过程。此处注意返回值为结构体类型的指针,返回链表的头指针H
typedef struct node
{
int serial;
int code;
node *next;
}Josephring,*J