C语言实现约瑟夫环的问题(循环链表)

写博客的第二天,简单说一个小问题,约瑟夫环问题的实现。
本文主要是通过循环链表实现(建议掌握后再来看)。

问题是这样的,犹太史学家约瑟夫被罗马人gank后和39个犹太人同时躲进山洞,然后其余39人有点上头准备刚到底,约瑟夫想我的人生才刚开始有大把的plmm等我泡我不能就这么死了,于是便忽悠除他朋友以外的其他人举行一个自杀游戏,大家围成一个圈,然后从第一个人开始每数到第3个,数到三的人就要自杀,然后约瑟夫就把它和自己的朋友放到第16位和第31位躲过一劫,可见这人良心大大的坏。
那么要求我们用循环链表结构推出死亡的顺序,下面是代码。

#include<stdlib.h>
#include<stdio.h>
typedef struct Node
{
	int data;
	struct Node* Next; 
}Node;
//创建循环链表
Node *creat(int n)
{
	Node *p = NULL, *head,*s;
	head = (Node*)malloc(sizeof(Node));
	p = head;
	int item=1;
	if (n != 0)
	{
		 
		while (item <= n)
		{
			s = (Node*)malloc(sizeof(Node));
			s->data = item++;
			p->Next = s;
			p = s;
		}
		s->Next = head->Next;
	}	
	free(head);//把生成的头节点删掉,因为对于后面的问题没有帮助
	return (s->Next);
}
void main()
{
	int n = 41;
	Node *s = creat(n);
	Node *temp;
	/*核心算法,首先为什么要重复的去写s=s->next,如果直接让temp=s->next->next,会引发某些结点的数据无法检测到,
	在以后的指针环节中要尽量避免s->next->next这种代码的出现,很不安全
	*/
	while (s != s->Next)
	{
		s = s->Next;
		printf("%d->", s->Next->data);
		temp = s->Next;
		s->Next=temp->Next  ;
		s = s->Next;//这波啊,这波是将temp架空
		free(temp);//进行人道主义毁灭
	}
	printf("%d", s->data);
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值