约瑟夫环代码
#include <stdio.h>
#include<stdlib.h>
typedef struct node
{
int Number;
struct node* Next;
}node;
node *create(int n)
{
//创建头指针指向第一个节点,申请第一个节点的空间
node* head = (node*)malloc(sizeof(node));
//头指针备份
node* headlock = head;
//赋值一个完整节点+申请下一个节点的存储空间,一直到n-1个,跳出循环后第n个节点已经创建还没赋值
for (int i =1; i<n; i++)
{
head->Number = i;
node* now = (node*)malloc(sizeof(node));
head->Next = now;
head = head->Next;
}
//此时head指向n个节点,赋值,OK了
head->Next = headlock;
head->Number = n;
head = head->Next;
return head;
}
void func(int n, int k) //n 总数,K->第几个人要出局
{
node* headlock;
node* phead;
node* head = create(n);
while(head != head->Next)
{
for (int i = 1; i < k-1; i++) //从第1个跳K-2下指向第K-1个
{
head = head->Next;
}
phead = head; //phead指向第K-1个
head = head->Next; //指向第K个
printf("->%d", head->Number); //第K个出局
headlock = head;
phead->Next = head->Next; //第K-1个指向第K+1个
head = head->Next;
free(headlock); //释放第K个内存
}
printf("->%d", head->Number); //最后一个人
}
int main()
{
func(41,3);
return 0;
}