约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int num;
struct node *next;
}node,*Linklist;
void create(Linklist &L,int n)
{
int i;
Linklist p,s;
p = (Linklist)malloc(sizeof(node));
p->num = 1;
L = p;
for(i=2;i<=n;i++)
{
s = (Linklist)malloc(sizeof(node));
s->num = i;
p->next = s;
p = s;
}
p->next = L;
}
void yushefu(Linklist &L,int m,int n,int k)
{
Linklist p ,s,q;
p = L;
int i = m+k-1;
int j;
while(p->next != p)
{
j=1;
while(j<i)
{
q = p;
p = p->next;
j++;
}
printf("%d\n",p->num);
s = p;
q->next = p->next;
p = p->next;
free(s);
i = m;
}
printf("%d\n",p->num);
}
int main()
{
Linklist L;
int m,n,k;
n = 9;
m = 8;
k = 5;
L = (Linklist)malloc(sizeof(node));
create(L,n);
yushefu(L,m,n,k);
return 0;
}