这是一道经典的链表题

约瑟夫环–自杀环问题

约瑟夫环问题有着这样的历史:

Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓。于是决定了自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀。然后下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

大致意思
一共有N个人围坐在一起, 循环周期是M, 第一个人报数1, 第二个人报数2, 当报数到M时, 这个人就会出列。 下一个人继续从1开始报数, 整个过程持续到所有人出列为止。 这种问题一般会问最后一个出列的人是谁, 或者问你某个人是第几个出列的。。。

对于学习了计算机的我们来说,重复性如此强的过程,当然要交给计算机来帮我们完成呐。所以我们一起来编写这个程序吧。

之前更了数组实现和数学推理方法,现在来补链表法。

大致思路

建立一个单向循环链表(看题目而定),先建立一个表头,在把每个人一个一个的尾插进去,然后把头尾相连。在模拟报数,把要自杀的人一个一个删掉,最后留下来的那个,就是答案。

#include<stdio.h>
#include<stdlib.h>
typedef struct node{int data;struct node *next;
} node;node* creat(int data)
{node *head;head = (node *)malloc(sizeof(node));head->data = data;head->next = NULL;return head;} //建立链表
node* creatnode(node* head, int data)
{node *now = head;node *neww = (node*)malloc(sizeof(node));neww->data = data;neww->next = NULL;while(NULL != now->next)now = now->next;now->next = neww;return neww;
}
//插入节点
void merge(node* head, node* end)
{end->next = head;
}
//首尾相连
void detele(node* qian, node* need){qian->next = need->next;free(need);
}
//删除节点
int main()
{node *head = creat(1);node *end;node *now = head;int n, m, i, j;//n表示有多少个人,m表示报到几就自杀。scanf("%d%d", &n, &m);for(i=2;i<=n;i++)end = creatnode(head, i);merge(head, end);node *qian = end;for(i=1;i<n;i++){for(j=1;j<m;j++){now = now->next;qian = qian->next;}if(i!=(n-1)){detele(qian, now);now = qian->next;}}printf("%d", qian->data);return 0;}

谢谢观看!数组模拟实现和数学推理法在这里!

约瑟夫环---自杀环问题 简单明了的循环链表版相关推荐

  1. 约瑟夫环---自杀环问题 C++数组实现 数学推理

    约瑟夫环–自杀环问题 约瑟夫环问题有着这样的历史: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个 ...

  2. java实现约瑟夫环完整算法_Java简单实现约瑟夫环算法示例

    Java简单实现约瑟夫环算法示例 发布时间:2020-10-01 14:19:56 来源:脚本之家 阅读:104 作者:perfect亮 本文实例讲述了Java简单实现约瑟夫环算法.分享给大家供大家参 ...

  3. —— 约瑟夫环(自杀环)的数学解法

    首先简单介绍一下约瑟夫环: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围. 从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从 ...

  4. 约瑟夫环问题(C语言数组和循环链表)

    本文将用两种方式(数组和循环链表)求解约瑟夫环问题,为了更好理解,本文将从洛谷的P1996 约瑟夫问题出发. 题目描述 n个人围成一圈,从第一个人开始报数,数到 m的人出列,再由下一个人重新从1开始报 ...

  5. 循环链表构建及解决约瑟夫环、逢七过、链表逆置问题

    文章目录 循环链表构建 测试 约瑟夫环 逢七过 链表逆置 循环链表构建 循环链表与链表区别就在于尾指针不再指向null而是指向头指针,形成环. 接口定义: package p1.接口;import j ...

  6. 约瑟夫环以及约瑟夫生死者游戏的C/Java代码实现

    文章目录 前言 一.概念了解 二.实验设计 1.链表初始化 2.功能实现 3.完整代码 4.效果 三.约瑟夫生死者游戏 1.概念 2.解决 3.C实现 4.Java实现 前言 约瑟夫环问题,是一个经典 ...

  7. java实现简单的约瑟夫环问题(二)

    Josephus(约瑟夫)问题的数学方法 前面的内容都是直接来来自于百度百科,后面才是我对这段话的理解 无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间 ...

  8. java实现简单的约瑟夫环问题

    我自己学习数据结构的时候,总希望能找到很简单的入门代码,可总是很难找到,于是就想到能写一些简单的java代码.  在百度百科上面搜索到约瑟夫环的问题时,并没有发现java的简单实现,自己在下面弄也是弄 ...

  9. 约瑟夫环(简单版)c语言解决

    传说约瑟夫当年活下来就是靠快速计算这个问题. n 个人围成一圈,编号依次为 1,2,3-n.从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈.以此类推,直 ...

最新文章

  1. usaco Number Triangles
  2. python将输出结果写入csv,在Python中将彩色输出写入CSV文件
  3. 从MATLAB帮助文档上学习 chirp
  4. 李宏毅机器学习课程9~~~深度学习技巧
  5. 华为上机试---购物单(算法:背包问题)
  6. js 判断字符是否以汉字开头
  7. ios 7.1企业证书无线安装
  8. Java 8 新特性:3-函数(Function)接口
  9. 列表左右移动 2017-03-23
  10. ubuntu 16.04/14.04 ORK 在 Kinect v2和 Kinect v1的安装(物体位姿估计)
  11. 南京邮电大学电子电路课程设计可编程音乐自动演奏电路
  12. DSP 2812: 使用C++封装SCI
  13. mysql 中 字典表设计_数据库怎么设计字典表
  14. SpringMVC工作原理图
  15. 2021清北学堂储备营Day1
  16. ViewBinding使用时出现Could not find method viewBinding() for arguments错误
  17. UE4遇到的各种奇葩问题
  18. vue3:加载本地图片等静态资源
  19. Android安全相关
  20. win10 系统禁用笔记本自带键盘的有效方法

热门文章

  1. 思科模拟器Cisco Packet Tracer交换机划分VLAN配置
  2. 77期:全世界数一数二的MySQL团队如何做到的
  3. Fedora 装系统后连接不上无线网络和蓝牙设备
  4. 安装Kibana、head、IK分词器后IK的使用
  5. 指针和 php引用的区别,c的指针和php中的引用的区别
  6. css烟花绽放效果代码,css3+js实现烟花绽放的动画效果(代码示例)
  7. 自定义类组件无法ref的解决方法 React
  8. 【转】游戏黑客亲述盗号全过程 揭露黑客产业链
  9. Android帧动画和补间动画
  10. 分享两个决策方法WCCA和WADM