[问题描述]

约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。

1、利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。

2、m的初值为20;密码:3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)。

3、程序运行后首先要求用户指定初始报数上限值,然后读取各人的密码。设n≤30。

我们采用不带头结点的尾插法建立单链表。

第一:如果我们用头插法,链表的中数据是逆序的,不利于操作。

第二:如果采用带头结点的单链表,每次遍历的时候,头结点不方便处理。

代码

#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LNode {ElemType data;struct LNode* next;
}LinkNode;// 尾插法建立不带头结点循环单链表{1,2,3,4,5,6,7}
LinkNode* Create(int n) {LinkNode* Q = NULL, * s;int i;Q = (LinkNode*)malloc(sizeof(LinkNode));Q->data = 1;//给首节点赋初值Q->next = Q;//将指针指向自己for (i = 2; i <= n; i++) {// 从第二个节点开始创建节点并赋值s = (LinkNode*)malloc(sizeof(LinkNode));s->data = i;s->next = Q->next;Q->next = s;Q = s;// 指针指向最后一个节点}return Q;// 将指针返回,以便后续调用
}void Joeph(LinkNode* Q, int m) {LinkNode* pre = Q;LinkNode* p = Q->next;//将指针指向首节点int count = 1;// 计数器int arr[] = { 0, 3, 1, 7, 2, 4, 8, 4 };//将密码全部存放在一个数组中printf("出环的顺序是:\n");while (p->next != p) {//链表中有两个元素,则进入循环if (count < m) {//开始遍历pre = pre->next;p = p->next;count++;}else {printf("%d ", p->data);m = arr[p->data];//更改密码值pre->next = p->next;//删除节点pfree(p);p = pre->next;//让指针p一直处于pre的next位count = 1;// 每次循环结束,计数归1,以便下一次循环}}printf("%d ", p->data);//打印出最后一个节点free(p);//释放最后一个节点
}int main() {int n = 7,m = 0;LinkNode* Q = NULL;printf("请输入m的值:");scanf_s("%d", &m);Q = Create(n);Joeph(Q, m);return 0;
}

这里补充一个带头结点的写法:http://t.csdn.cn/KXjtc

支持一下咯!

基础很重要,要熟练掌握对链表的操作!

循环单链表解决约瑟夫问题相关推荐

  1. 第四次博客:循环单链表解决约瑟夫环问题

    #include <stdio.h> #include <stdlib.h> typedef struct aa{  int data;  struct aa *next; } ...

  2. 数据结构-循环单链表之约瑟夫问题

    约瑟夫问题的由来: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定 ...

  3. c语言循环单链表实现约瑟夫环问题

    题目: 约瑟夫(Joeph)问题的一种描述是:编号为1,2,-,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个正整数作为报数上限值max,从第一个人开始按顺时针方向自1开始 ...

  4. java 单链表约瑟夫环_java循环单链表实现约瑟夫环问题

    package SingleLinkList; //节点类 class Node{ private int data; private Node next; public int getData() ...

  5. java模拟单链表环形链表解决约瑟夫问题

    java模拟环形链表解决约瑟夫问题 此文是观看尚硅谷韩老师的数据结构与算法学习视频整理的笔记 约瑟夫问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算 ...

  6. 约瑟夫环问题---循环单链表

    约瑟夫环问题是比较经典的问题,原来做的题目是依次输出数字,而原来的循环链表结构不改变,今天遇到一道题是要求按照顺序重新组成一个循环单链表. 题目:一些人围坐一圈报数,形成一个循环单链表,当报数是m或m ...

  7. 左神算法:环形单链表的约瑟夫问题(Java版)

    本题来自左神<程序员面试代码指南>"环形单链表的约瑟夫问题"题目. 题目 据说,著名犹太历史学家 Josephus 有过以下故事: 在罗马人占领乔塔帕特后,39 个犹太 ...

  8. 【Java】单循环链表解决约瑟夫环问题

    问题描述 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自 ...

  9. 单链表实现约瑟夫环问题

    经典的约瑟夫环问题,用单链表实现竟然这么简单!? 目录 前言 问题 思路 代码 前言 这两天想到了之前自己用数组实现约瑟夫环问题时写了好多的代码,然后想到数据结构中的但链表好像也可以实现,于是去实践了 ...

最新文章

  1. 高效程序猿之(四)VS2010其他技巧
  2. Python练习_三级菜单
  3. 章磊回答: 姚期智提出的百万富翁难题被破解? 多方安全计算MPC到底是个什么鬼?
  4. 不让复制是不可能的----js获取选中文字
  5. 「2017 山东一轮集训 Day2」Pair (霍尔定理+线段树)
  6. .NET 程序下锐浪报表 (Grid++ Report) 的绿色发布指南
  7. AD库转换为KiCAD库的方法
  8. Python dict 调试技巧 —— 利用YAML存储dict内容
  9. Python学习笔记(序列和元组)
  10. 机械--NX2007(UG)有限元分析教程2--装配体
  11. Verilog——三角波发生器(状态机)
  12. 模型组合方法-boosting算法详解(机器学习面试必备)
  13. php 多图合成一张,多张图片拼成一张图,支持图片拼接功能,多种拼图模板的软件...
  14. 拔丝芋头的Java学习日记--Day1
  15. 「读书笔记」余生,请多指教
  16. 如何将Jenkins基础环境迁移到Docker?
  17. Kali Linux修改更新源
  18. 农村中学扩建工程全套CAD施工图哪里找?
  19. RFID医疗耗材柜管理系统中的解决方案
  20. 啥是正交实验简单了解

热门文章

  1. 库克再访华受到深圳书记市长接待 要建研发中心
  2. 阿里巴巴技术开发手册
  3. Ubuntu20.04安装CUDA和cuDNN
  4. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A. Saving Tang Monk II
  5. asp.net危险废物管理系统VS开发sqlserver数据库web结构c#编程计算机网页项目
  6. 解锁智能名片具备的九大因素,让选择更加明确
  7. 迁徙在互联网风口之间的年轻人
  8. 通过JLINK给CC1310烧录程序
  9. JustAuth 1.15.9 版发布,支持飞书、喜马拉雅、企业微信网页登录
  10. 5G时代下的创新技术和应用场景