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

写博客的第二天,简单说一个小问题,约瑟夫环问题的实现。
本文主要是通过循环链表实现(建议掌握后再来看)。
问题是这样的,犹太史学家约瑟夫被罗马人gank后和39个犹太人同时躲进山洞,然后其余39人有点上头准备刚到底,约瑟夫想我的人生才刚开始有大把的plmm等我泡我不能就这么死了,于是便忽悠除他朋友以外的其他人举行一个自杀游戏,大家围成一个圈,然后从第一个人开始每数到第3个,数到三的人就要自杀,然后约瑟夫就把它和自己的朋友放到第16位和第31位躲过一劫,可见这人良心大大的坏。
那么要求我们用循环链表结构推出死亡的顺序,下面是代码。
#include
#include
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);
}

你可能感兴趣的:(C语言实现约瑟夫环的问题(循环链表))