“约瑟夫环.h”
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<assert.h>
//共有的个数
#define A 40 //A个一旋转
struct List{
struct List * next;
int data;
};
typedef struct List List;
//初始化
void Init(List **ppfirst)
{
(*ppfirst)->next = (*ppfirst);
}
//创建约瑟夫环
List *GreatList(int k)
{
List*pnew;
pnew = (List *)malloc(sizeof(List));
assert(pnew);
pnew->data = k;
return pnew;
}
//创建约瑟夫环
void pushfromtail(List **ppfirst)
{
int i = 0;
List*pnode = (*ppfirst);
List*head = (*ppfirst);
pnode = GreatList(1);
pnode->next = pnode;
for (i = 2; i <= A; i++)
{
List*pnew = GreatList(i);
pnode->next = pnew;
pnode = pnew;
printf("%d-> ", pnode->data);
}
pnode->next = head;
}
//销毁第K个
void Joac(List*ppfirst,int k)
{
List*p1 = ppfirst;
List*p2 = ppfirst;
List*s = NULL;
while (p1->next != p1){
for (int i = 1; i < k - 1; i++)
{
p1 = p1->next;
}
p2 = p1->next->next;
s = p1->next;
p1->next = p2;
free(s);
}
printf("%d ", p1->data);
}
源.cpp
#include"约瑟夫环.h"
int main()
{
List*pp;
Init(&pp);
pushfromtail(&pp);
Joac(pp, 4);
system("pause");
return 0;
}