在这里先回顾一下约瑟夫环的问题:
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
这里选择使用最简易的链表实现,模拟游戏过程,代码如下:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct List
{
int data;
List *next;
}List;
void CreateList(List *&Head,int n)
{
List *p,*Node;
int i;
for (i=1;i<=n;i++)
{
Node=(List*)malloc(sizeof(List));
Node->data=i;
if (Head==NULL)
{
Head=Node;
}
else
{
p->next=Node;
}
p=Node;
}
p->next=Head;
}
void DeleteNode(List *&head,int s,int m)
{
int i;
List *p,*q;
p=head;
for (i=0;i<s-1;i++)
{
q=p;
p=p->next;
}
while (p->next!=p)
{
for (i=0;i<m-1;i++)
{
q=p;
p=p->next;
}
q->next=p->next;
printf("%d,",p->data);
free(p);
p=q->next;
}
printf("%d\n",p->data);
}
int main()
{
int n,s,m;
while(scanf ("%d %d %d",&n,&s,&m)!=EOF)
{
if (n==0&&s==0&&m==0)
return 0;
List *head=NULL;
CreateList(head,n);
DeleteNode(head,s,m);
}
return 0;
}