【数据结构】【C语言】【环形链表约瑟夫问题】

1.问题描述及背景:

著名的Josephus问题

据说著名犹太

历史学家

Josephus有过以下的故事:在罗⻢⼈占领乔塔帕特后,39 个犹太⼈与

Josephus及他的朋友躲到⼀个洞中,39个犹太⼈决定宁愿死也不要被⼈抓到,于是决定了⼀个⾃杀

⽅式,41个⼈排成⼀个圆圈,由第1个⼈开始报数,每报数到第3⼈该⼈就必须⾃杀,然后再由下⼀

个重新报数,直到所有⼈都⾃杀⾝亡为⽌。

然⽽Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与⾃⼰安排在

第16个与第31个位置,于是逃过了这场死亡游戏。

描述

编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。

下一个人继续从 1 开始报数。

n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?

说明:

开始5个人 1,2,3,4,5 ,从1开始报数,1->1,2->2编号为2的人离开

1,3,4,5,从3开始报数,3->1,4->2编号为4的人离开

1,3,5,从5开始报数,5->1,1->2编号为1的人离开

3,5,从3开始报数,3->1,5->2编号为5的人离开

最后留下人的编号是3

2.代码实现:

一:创建环形链表

二:一前一后创建两个指针,

c 复制代码
#include<stdio.h>
#include<stdlib.h>
typedef struct SLNode
{
	int data;
	int* next;
}SLNode;
//申请空间:
SLNode* SLBuyNode(int x)
{
  SLNode* node=(SLNode*)malloc(sizeof(SLNode));
  node->data=x;
  node->next=NULL;
}
//创建环形链表:
SLNode*Create(int n)
{
  SLNode* phead=SLBuyNode(1);
  SLNode*ptail=phead;
  for(int i=2;i<=n;i++)
  {
   SLNode* node=SLBuyNode(i);
   ptail->next=node;
   ptail=ptail->next;
  }
  ptail->next=phead;
  return ptail;
//实现约瑟夫函数:
int ysf(int n,int m)
{
SLNode*prev=Create(n);
SLNode*cur=prev->next;
int count=1;
while(cur!=cur->next)
{
 if(count==m)
 {
  prev->next=cur->next;
  free(cur);
  cur=prev->next;
  count=1;
 }
  else
  {
   prev=cur;
   cur=cur->next;
   count++;
  }
}
return cur->data;

int main()
{
int tem=ysf(5,3)
printf("%d\n",tem);
return 0;
}
相关推荐
世人万千丶40 分钟前
参数管理_Flutter在鸿蒙平台路由参数最佳实践
学习·flutter·华为·harmonyos·鸿蒙
大模型码小白1 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
段一凡-华北理工大学3 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe3 小时前
C++——多态
开发语言·c++
遇乐的果园4 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
延凡科技4 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
心平气和量大福大4 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf
遇乐的果园5 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习
从零开始的代码生活_5 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸5 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++