[问题描述]

约瑟夫(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. VMware上安装ubuntu 13.04
  2. 使用阿里云ACM简化你的Spring Cloud微服务环境配置管理
  3. 大数据(11) - kafka的安装与使用
  4. JBoss模块很糟糕,无法在JBoss 7下使用自定义Resteasy / JAX-RS
  5. OpenCL memory object 之 Global memory (2)
  6. AI算法连载18:统计之EM 迭代算法
  7. 毕设日志——配置服务器与测试gpu版本的tf faster rcnn代码
  8. [CSS] 详细解释 @media 属性与 (max-width:) and (min-width) 之间的关系及用法
  9. eclipse Git使用教程
  10. winsdk仿win7扫雷
  11. 华硕笔记本触摸板使用热键无法关闭打开
  12. 数据结构与算法之迷宫回溯
  13. Verilog TestBench 高级教程
  14. Android ROM开发(一)——Windows下Cygwin和Android_Kitchen厨房的安装
  15. Guava 指南 之「前置条件」
  16. 什么是IoT、IT、OT、CT
  17. 基于java/php/python的毕业设计管理系统开题报告
  18. 【编程语言】函数式编程 Functional Programming
  19. chm文件的文件格式 (chm format)
  20. 辐射度算法(radiosity)原理

热门文章

  1. abb外部轴零位校准_ABB机器人零点校准详细解读
  2. nginx(十)SNI理解
  3. appium示例代码python_(appium+python)UI自动化_07_UI自动化实例【拼多多搜索商品为例】...
  4. opencv实现人脸识别(四) 人脸识别模块
  5. 关于更新了10.14以后 罗技Optins驱动下的鼠标滚轮及功能键失效的解决方法
  6. 搭建实验室3d slam 移动小车 3.2jackal移动平台axis-ptz魚眼摄像头调试
  7. 启动异常:java.lang.NoClassDefFoundError: org/apache/curator/framework/CuratorFrameworkFactory 解决方法
  8. 电脑端必用思维导图软件,选一款就够了
  9. 电脑的计算机控制面板都打不开怎么回事,电脑打不开NVIDIA控制面板怎么解决|N卡控制面板停止工作的解决方法...
  10. 一阶电路中的时间常数_一阶电路的三要素法公式及例题