n个犯人围成一圈,每个人手里都有一个数值,查这个数值个人,然后杀掉这个人,输出数值,并获得杀掉的人手里的数值,接着查更新过的数值个人,然后杀掉这个人。就相当于每查一次,就有一个人从环中出局。
#include<stdio.h>
#include<stdlib.h>
#define N 9
#define OVERFLOW 0
#define OK 1
int KeyW[N]={1,2,3,4,5,6,7,8,9};
typedef struct
{
int keyword;
struct LNode* next;
}LNode,*LinkList;
void Joseph(LinkList p,int m,int x)/*环 手里的密码 环里人的总数*/
{
LinkList q;
int i;
if(0==x)
return ;
q=p; //get head node
m%=x;
if(0==m)m=x;
for(i=1;i<=m;i++) //find next node
{
p=q;
q=p->next;
}
p->next=q->next;
i=q->keyword;
printf("%d\t",q->keyword);
free(q);
Joseph(p,i,x-1);
}
int main(void)
{
int i,m;
/*建环*/
LinkList Lhead,p,q; //head pointer worker pointer 1 2
Lhead=(LinkList)malloc(sizeof(LNode));
if(!Lhead)return OVERFLOW;
Lhead->keyword=KeyW[0];
Lhead->next=NULL;
p=Lhead;
for(i=1;i<9;i++)
{
if(!(q=(LinkList)malloc(sizeof(LNode))))return OVERFLOW;
q->keyword=KeyW[i];
p->next=q;
p=q;/*p相当于尾指针*/
}
p->next=Lhead;
printf("please input the first record m\n");
scanf("%d",&m);
printf("The output alignment is :\n");
Joseph(p,m,N);
return OK;
}
输入4,结果如下。