已知n个人,编号1到n,围坐在一张圆桌周围,从k开始报数,数到m的人出列,下一个人又从k开始报数,到m出列,直至全出列。
步骤:
1.建立一个有n个链节点无头节点的循环链表
2.确定第一个报数人位置
3.不断从链中删除节点至链表为空
代码:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#define ERROR 0
typedef struct LNode{
int data;
struct LNode *link;
}LNode,*LinkList;
void JOSEPHUS(int n,int k, int m){
//n为总人数,k为第一个报数人,m为出列者喊的数
LinkList p,r,list,curr;
//p为当前节点,r为辅助节点,指向p的前驱节点,list为头节点
//建立循环链表
p=(LinkList)malloc(sizeof(LNode));
p->data=0;
p->link=p;
curr=p;
for(int i=1;i<n;i++){
LinkListt=(LinkList)malloc(sizeof(LNode));
t->data=i;
t->link=curr->link;
curr->link=t;
curr=t;
}
//把指针移到第一个报数的人
r=curr;
while(k--){
r=p;
p=p->link;
}
while(n--){
for(ints=m-1;s--;r=p,p=p->link);
r->link=p->link;
printf("%d->",p->data);//出列者
free(p);
p=r->link;
}
}
int main(){
JOSEPHUS(13,4,5);
return 0;
}
运行结果: