约瑟夫环问题

来源:互联网 发布:公司取名大师软件 编辑:程序博客网 时间:2024/06/01 17:59

下面是自己写的比较好理解的约瑟夫环问题。

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");}