约瑟夫环

约瑟夫环代码

#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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值