约瑟夫环规则如下:
1、一群人围在一起坐成 环状(如:N)
2、从某个编号开始报数(如:K)
3、数到某个数(如:M)的时候,此人出列,下一个人重新报数
4、一直循环,直到所有人出列 ,约瑟夫环结束
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define N 10
typedef struct node{
int data;
struct node *next;
}ElemSN;
//创建循环链表
ElemSN* CreatCirculLink(int a[],int n){
ElemSN *head,*tail,*p;
head=NULL;
for(int i=0;i<n;i++){
p=(ElemSN*)malloc(sizeof(ElemSN)); //创建结点
p->data=a[i];
p->next=NULL;
if(!head){ //如果当前创建的结点为头结点,需要单独处理
p->next=p;
head=tail=p;
}else{ //如果当前创建的结点不是头结点
p->next=head;
tail=tail->next=p;
}
}
return head;
}
ElemSN* JosephCircle(ElemSN *head,int k,int m){ //从编号为k的人开始报数,数到m的人出圈
ElemSN *p,*q;
int tag;
p=head;
for(;p->data-k;p=p->next);
while(p->next-p){
for(tag=m-1;tag>0;tag--){
q=p;
p=p->next;
}
printf("编号为%d的人出圈\n",p->data);
q->next=p->next;
free(p);
p=q->next;
}
printf("获胜的是%d号",p->data);
}
int main(void){
ElemSN *head;
int a[N]={3,2,5,8,4,7,6,9,0,1};
head=CreatCirculLink(a,N); //创建循环链表
JosephCircle(head,2,4); //从第二个人开始报数,数到四的人就出圈
}
运行结果如下: