求解Josephus问题:设有n个数构成一个环链,现从第k个数开始数数,数到m的那个数被弹出,然后从该数的下一个数重新开始数数,数到m的那个数又被弹出,如此重复,直到所有的数均被弹出为止。输出这些数弹出的序列。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct Node {
int no;
int m;
struct Node *next;
} Node, *LinkList;
LinkList Creat(int m, int n, int mm[])
{
LinkList L;
int i;
Node *r,*s;
L=(LinkList)malloc(sizeof(Node));
r=L;
for (i=0; i<n; i++)
{
s=(Node *)malloc(sizeof(Node));
if (s==NULL)
{
printf("错误:内存不足!/n");
return NULL;
}
s->no=i+1;
s->m=mm[i];
r->next=s;
r=s;
}
L->no=0;
L->m=0;
r->next=L;
return L;
}
void Josephus(LinkList L, int m, int n)
{
int i,j,nn=n;
Node *p,*q;
p=L;
for (i=0;i<n;i++)
{
if (m<2) m=m+nn;
for (j=0;j<m-2;j++)
{
if (p->no==0) p=p->next;
p=p->next;
}
q=p->next;
if (q->no==0) q=q->next;
m=q->m;
printf("%4d",q->no);
p->next=q->next;
free(q);
nn--;
p=p->next;
}
}
main()
{
int m,n,i,mm[MAXSIZE]/*={3,1,7,2,4,8,4}*/;
int ch=0, c;
LinkList L;
/* m=20;n=7;
Only For Test*/
printf("输入m:");scanf("%d",&m);
printf("输入n:");scanf("%d",&n);
printf("输入密码:");
for (i=0;i<n;i++)
scanf("%d",&mm[i]);
L=Creat(m,n,mm);
printf("得到序列如下:/n");
Josephus(L,m,n);
printf("/n");
return 0;
}