您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法(单循环链表_约瑟夫问题)

2015-06-09 23:02 351 查看
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

我这个程序写到最后,整个循环链表都拆了····找个时间再优化一下···

编程:实现打印出自杀的犹太人的顺序,剩下约瑟夫和他的朋友不用死。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

int PEODATA;	//人数
#define LEN sizeof(struct listdata)

typedef struct listdata
{
int num;
struct listdata *next;
}node;

node *Clist()
{
int i;
node *Head = NULL;
node *P1,*P2;

for(i = 1;i < 42;i++)
{
if(Head == NULL)
{
P1 = (node*)malloc(LEN);
P1->num = i;
P2 = P1;
Head = P1;
PEODATA++;
}
else
{
P1 = (node*)malloc(LEN);
P1->num = i;
P2->next = P1;
P2 = P1;
PEODATA++;
}
}
P1->next = Head;
return Head;
}

node *OVlist(node *head)
{
int i;
node *P1,*P2;
P2 = P1 = head;

while(PEODATA != 2)
{
for(i = 1;i < 3;i++)
{
if(i == 2)
{
P2 = P1->next;
P1->next = P2->next;
printf("第%d个人自杀了\n",P2->num);
free(P2);
}
P1 = P1->next;
}
PEODATA--;
}
return head;
}

void main()
{
node *head;
system("color 0A");
PEODATA = 0;
printf(" /*********************/ \n");
printf(" 循环链表应用:约瑟夫问题 \n");
printf(" 编写者: H               \n");

head = NULL;
head = Clist();

printf("41个人已围成一个圈,约瑟夫在第16个位置,约瑟夫的朋友在第31个位置.\n");
printf("自杀游戏开始!\n\n");
head = OVlist(head);
printf("\n约瑟夫和他的朋友生存了下来!\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: