下面是自己写的比较好理解的约瑟夫环问题。
1. 首先需要创建循环链表,相对于单链表,在最后加上尾巴指向头即可。
2.用到k步,需要用到循环移动。
3.移动m-1步的方法,可以类似移动k步,但是要注意需要保持值,因为下一次还是移动m-1步的,假若不保存,只能打印第一个出列的。
下面是源代码:
#include<stdio.h>
#include<malloc.h>
typedef struct student
{
int data;
struct student *next;
}node;
void yuesefu(int n,int k,int m)
{
node *p,*curr,*r,*t;
int kk;
p=(node *)malloc(sizeof(node));
p->data=1;
p->next=p;
curr=p;
for(int i=2;i<=n;i++)
{
t=(node *)malloc(sizeof(node));
t->data=i;
curr->next=t;
curr=t;
}
curr->next=p;
m=m-1;
while(k--){r=p;p=p->next;}
while(n--)
{
kk=m;
while(m--){r=p;p=p->next;}
r->next=p->next;
printf("%d->",p->data);
free(p);
p=r->next;
m=kk;
}
}
void main()
{
yuesefu(13,4,2);
printf("\n");
}