问题描述:

刚学数据结构的时候,我们可能用链表的方法去模拟这个过程,N个人看作是N个链表节点,节点1指向节点2,节点2指向节点3,……,节点N - 1指向节点N,节点N指向节点1,这样就形成了一个环。然后从节点1开始1、2、3……往下报数,每报到M,就把那个节点从环上删除。下一个节点接着从1开始报数。最终链表仅剩一个节点。它就是最终的胜利者。
举例:某天你去原始森林玩,碰到了一群土著邀请你去玩一个杀人游戏8个人围坐一圈,报数,报到3的人拿根绳吊死,问如何保命,笑到最后

思路分析:

该问题可以抽象为一个无头节点单向循环链表,链表中有8个节点,各节点中依次填入数据1,2,3,4,5,6,7,8

  • 初始时刻,头指针指向1所在的节点
  • 每隔2个节点,删除一个节点,需要注意的是删除节点前,要记录下一个节点的位置,所以要定义两个指针变量,一个指向当前节点,另一个指向当前节点的前一个节点,
  • 删除节点节点前,记录要删除节点的下一个节点的位置
  • 删除节点后当前节点指向删除节点的下一个节点
     prenode->next = curnode->next;printf("%d\t", curnode->data);free(curnode);curnode = prenode->next;

完整代码

main.c(用于测试)


#include<stdio.h>
#include<stdlib.h>
#include "list.h"int main()
{struct node_st  *list = NULL,*lastnode =NULL;list=list_create(SIZE);list_show(list);list_kill(&list, STEP);list_show(list);return 0;
}

list.c(用于函数定义)

#include<stdio.h>
#include<stdlib.h>
#include "list.h"//约瑟夫环可以使用无头节点,单向循环链表来表示
struct node_st* list_create(int n)
{int i = 1;struct node_st* p = NULL;struct node_st* ps = NULL;struct node_st* q = NULL;p = (struct node_st*)malloc(sizeof(struct node_st));if (p == NULL){return NULL;}p->data = i;p->next = p;i++;//定义一个结构体变量,记录约瑟夫环起始位置ps = p;while (i <= n){q = (struct node_st*)malloc(sizeof(struct node_st));if (q == NULL){return NULL;}q->data = i;q->next = ps;p->next = q;p = q;i++;}return ps;
}void list_show(struct node_st* ps)
{//一般来讲,我们不移动头指针ps,而是移动ps的拷贝,原因://出错时方便调试以及头指针位置不丢失struct node_st* p = NULL;for (p = ps; p->next != ps; p = p->next){printf("%d\t", p->data);}printf("%d\n", p->data);
}void  list_kill(struct node_st** ps,int n)
{struct node_st *prenode = NULL;struct node_st *curnode = *ps;int i = 0;while (curnode != curnode->next){//每轮删除,隔n-1个节点,删除一个节点while (i < n - 1){prenode = curnode;curnode = curnode->next;i++;}prenode->next = curnode->next;printf("%d\t", curnode->data);free(curnode);curnode = prenode->next;i = 0;}*ps = curnode;printf("\n");}

list.h(负责函数声明)

#ifndef LIST_H__
#define LIST_H__
#define SIZE 8
#define STEP 3
struct node_st
{int data;struct node_st *next;
};
//约瑟夫环的创建
struct node_st* list_create(int n);
//约瑟夫环的展示
void list_show(struct node_st*ps);
//约瑟夫环删除节点
void list_kill(struct node_st** ps,int n);
#endif

约瑟夫环(杀人游戏)相关推荐

  1. C语言 (编程题:约瑟夫环 报数游戏)

    1.前言 最近有点emo,写博客也没有什么特别想写的内容 这篇博客把约瑟夫环用C语言来写一下 巩固一下原来学过的知识. 2.什么是约瑟夫环 这有个历史故事还是比较有意思的:据说著名犹太历史学家Jose ...

  2. python解决约瑟夫环(杀人游戏)

    约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围.从第s个人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此 ...

  3. 杀人游戏约瑟夫环(洛谷P1145题题解,Java语言描述)

    题目要求 题目链接P1145 约瑟夫环问题了解一下 约瑟夫环问题其实在数据结构里与单循环链表关系密切,但是这里模拟就完事~~ 我写过的约瑟夫环问题 AC代码(Java语言描述) import java ...

  4. 约瑟夫环生者死者游戏(JAVA)

    上周日参加一个比赛,在线编程里面有一道就是约瑟夫环的问题,当时脑子转不过来弯集合用的arraylist重复的元素不进行覆盖导致循环一直跳不出来....尼玛当时看了将近2个点好生郁闷.其实这个解决思路很 ...

  5. 1823. 找出游戏的获胜者( 约瑟夫环问题 )

    文章目录 Question Ideas 1.Answer( Java ) Code 2.Answer( Java ) Code 3.Answer( Java ) Code Question 1823. ...

  6. 约瑟夫环——递推公式详解(leetcode 1823. 找出游戏的获胜者)

    约瑟夫环--递推公式详解(leetcode 1823. 找出游戏的获胜者) 约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围. ...

  7. Leetcode题库1823. 找出游戏的获胜者(约瑟夫环 C实现)

    文章目录 思路 状态转移过程 状态转移方程 递归思路 迭代思路 补充 代码 递归 迭代 思路 状态转移过程 设 n 名小伙伴做游戏,计数为k 有n名小伙伴时,第一个离开的小伙伴编号为k,剩下n-1名小 ...

  8. 力扣1823题:找出游戏获胜者(约瑟夫环)

    本题刚开始我还在用数组去模拟删除,结果发现队列更简单: import java.util.ArrayDeque; import java.util.Queue; import java.util.Sc ...

  9. LeetCode 937. 重新排列日志文件 / 1823. 找出游戏的获胜者(约瑟夫环问题) / 713. 乘积小于 K 的子数组

    937. 重新排列日志文件 2022.5.3 每日一题 题目描述 给你一个日志数组 logs.每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 . 有两种不同类型的日志: 字母日志: ...

最新文章

  1. GSS-API GSSAPI 介绍 通用的安全机制
  2. semantic ui框架学习笔记三
  3. 基于hsv的亮度调整算法_基于手绘工程图离线识别的预处理研究精品论文推荐
  4. LAMP环境中如何重新部署一个Yii2.0 web项目
  5. js实现全角字符转换成半角字符
  6. TensorFlow tf.keras.backend.ctc_batch_cost
  7. 【数论Day1】 最大公约数(gcd)题目
  8. Python socket 编程理解
  9. 如何在Mac上创建和使用符号链接?
  10. 关于如何理解链表结构体指针引用LinkNode * L的问题
  11. CC_STACKPROTECTOR防内核堆栈溢出补丁分析【转】
  12. java odbc timesten_TimesTen 使用ODBC连接数据库的程序问题
  13. 【python学习】python实现利用pygame绘画基本图形、显示图片,实现图形图片随机效果。python绘制行列图片
  14. TP5 PHPExcel导出类
  15. 如何生成高效、兼容性好的Poco定位脚本
  16. 关于大屏展示自适应的处理
  17. 【R模型】R语言二元logistic回归 (保姆级教程)
  18. 如何将mongo查询结果导出到文件中以及导入到另一个Mongo库中
  19. 概率论与数理统计---随机变量的分布
  20. 用Python爬取高颜值美女(爬虫+人脸检测+颜值检测)

热门文章

  1. 设计模式之组合模式(Composite 模式)
  2. 工具分享 --- 分享一个在线制作ico的网站
  3. sql中的left join、right join、inner join
  4. ES5-9 【utils】构造函数及实例化原理、包装类
  5. Codeforces 821C - Okabe and Boxes
  6. 数据分析真的能驱动用户快速增长吗?
  7. HDU4506 小明系列故事——师兄帮帮忙
  8. CentOS6.3中挂载NTFS移动硬盘的经历
  9. OpenStack tokens id获取测试
  10. Nginx内核参数相关的优化设定