写博客的第二天,简单说一个小问题,约瑟夫环问题的实现。
本文主要是通过循环链表实现(建议掌握后再来看)。
问题是这样的,犹太史学家约瑟夫被罗马人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);
}