#include<iostream>
#include<stdio.h>
using namespace std;
//循环链表报数问题,n个人编号分别为1,2,3,……n,从第k个编号开始数1,2到m个然后删除第m个人,然后下
//一个人再从1开始数数到第m个,然后再删除m人
struct Lnode
{
int data;
Lnode *link;
};
void josephus(int n,int k,int m)
{
//n为总人数,k为第一个开始报数的人,m为出列者喊道的数
/*p为当前节点,r为辅助节点,指向p的的前驱节点,list为头节点*/
/*建立循环链表*/
Lnode *p,*r,*curr,*list;
p=(Lnode*)malloc(sizeof(Lnode));
p->data=1;
p->link=p;
curr=p;
for(int i=2;i<=n;i++)
{
Lnode *ln=(Lnode*)malloc(sizeof(Lnode));
ln->data=i;
ln->link=curr->link;
curr->link=ln;
curr=curr->link;
}
/*把当前指针移动到第一个报数的人*/
r=curr;
while(r->data!=k)r=r->link;
while(n--)
{
for(int i=1;i<m-1;i++)
r=r->link;//当数到m-1的时候
cout<<r->link->data<<endl;
p=r->link;
r->link=r->link->link;
free(p);
p=r=r->link;
}
}
void main()
{
josephus(9,1,3);
system("pause");
}
#include<stdio.h>
using namespace std;
//循环链表报数问题,n个人编号分别为1,2,3,……n,从第k个编号开始数1,2到m个然后删除第m个人,然后下
//一个人再从1开始数数到第m个,然后再删除m人
struct Lnode
{
int data;
Lnode *link;
};
void josephus(int n,int k,int m)
{
//n为总人数,k为第一个开始报数的人,m为出列者喊道的数
/*p为当前节点,r为辅助节点,指向p的的前驱节点,list为头节点*/
/*建立循环链表*/
Lnode *p,*r,*curr,*list;
p=(Lnode*)malloc(sizeof(Lnode));
p->data=1;
p->link=p;
curr=p;
for(int i=2;i<=n;i++)
{
Lnode *ln=(Lnode*)malloc(sizeof(Lnode));
ln->data=i;
ln->link=curr->link;
curr->link=ln;
curr=curr->link;
}
/*把当前指针移动到第一个报数的人*/
r=curr;
while(r->data!=k)r=r->link;
while(n--)
{
for(int i=1;i<m-1;i++)
r=r->link;//当数到m-1的时候
cout<<r->link->data<<endl;
p=r->link;
r->link=r->link->link;
free(p);
p=r=r->link;
}
}
void main()
{
josephus(9,1,3);
system("pause");
}