/*已知n个人(以编号1,2,3,。。。n分别表示)
围坐在一张圆桌周围。从编号为K的人开始报数,
数到m的那个人出列;他的下一个人又从k开始报数,
数到m的那个人出列;依次规律重复下去,
直到圆桌周围的人全部出列。*/
//约瑟夫环问题,循环链表
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef struct lnode
{
int data;
struct lnode *next;
}node;
node *link_create(int n)//创建n个节点的循环链表
{
node *p,*q,*head;
int i;
p=new node;
head=p;
p->data=1;
for(i=2;i<=n;i++)
{
q=new node;
q->data=i;
p->next=q;
p=q;
}
p->next=head;//最后一个节点指向头部,形成循环链表
return head;
}
void josephus(node *head,int k,int m)
{
node *p=head,*tmp1;
int i;
while(p->data!=k)
p=p->next;
while(p->next!=p)
{
for(i=0;i<m;i++)
{
tmp1=p;
p=p->next;
}
printf("%d",p->data);
tmp1->next=p->next;
delete p;
p=tmp1->next;
}
printf("%d ",p->data);
}
int main()
{
node *head=link_create(5);
josephus(head,3,1);
return 0;
}