问题简述:
约瑟夫问题的源头完全可以命名为“自杀游戏”。本着和谐友爱和追求本质的目的,我们把问题描述如下:
- 现有T个人围成一桌坐下,编号从1到T,从编号为1的人开始报数。
- 报数也从1开始,报到M的人离席,从离席者的下一位在座成员开始,继续从1开始报数。
- 复现这个过程(各成员的离席次序),或者求最后一个在座的成员编号。
代码展示:
#include<stdio.h>
#include<stdlib.h>
//WuXinYu
typedef struct Node
{
int data;
struct Node* next;
}Node;
//创建结构体变量
Node* Create(){
Node* head;
head = (Node*)malloc(sizeof(Node));
if (head == NULL) {
exit(1);
}
head->next = NULL;
return head;
}
//创建链表
int main(){
//Double Xin
int Pnum,Kill_num,i;
Node* tail,* p,* q;
Node* head = Create();
printf("请输入总人数:");
scanf("%d",&Pnum);
printf("请输入一个数字并让身处该数字的人go to die:");
scanf("%d",&Kill_num);
//完成输入总人数以及第几个人go to die
if(Pnum == 0 || Kill_num == 0){
return 0;
}
//判断是否存在不可能的情况,完备性检验。
else{
tail = head;//空链表让head指向tail
for (i = 0; i < Pnum; i++)
{
p = (Node*)malloc(sizeof(Node));
//建立一个插入节点p
if(p == NULL){
printf("申请失败");
exit(1);
}//完备性检验
p -> data = i+1;
tail -> next = p;
p -> next = head -> next;
tail = p;
//构建循环链表并且输入数据
}
p = head -> next;
q = tail;
i = 1;
} //以上为数据输入部分
while (p != q) //判断是否重合,重合则存在一个数据
{
if(i == Kill_num){
q -> next = p -> next;
printf("%d\t",p -> data);
free(p);
p = q -> next;
i = 1;
}/*WuXinYu*/
else{
q = p;
p = q -> next;
i++;
}
}
printf("\n");
printf("幸运儿是%d",p -> data);
return 0;
}