题目:

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

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

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

3、程序运行后首先要求用户指定初始报数上限值和参与游戏人数,然后读取各人的密码。

算法思路:

先用尾插法创建一个带头节点的循环单链表,创建的同时输入编号和对应的密码,为了确认是否创建成功,我们可以将链表遍历出来(show)。

然后我们进入约瑟夫环问题,成员依次报数,每当达到报数上限时,先覆盖上限值,再在循环单链表中删除当前节点,继续新一轮的报数,知道链表中剩下最后一个储存数据的结点。

首先我们需要有一个含编号和密码的结点类型,如下:

typedef struct Node
{int date;//编号int mima;//密码struct Node *next;
}Node;

这样比较清晰的知道,每一个编号对应储存的密码。

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{int date;int mima;struct Node *next;
}Node;
//创建带头节点的循环单链表
void create(Node *head,int size){head->next=head;Node *p=head;int i;printf("请输入每个人的密码(回车键分开):\n"); for(i=0;i<size;i++){Node *newnode =(Node *)malloc(sizeof(Node));newnode->date=i+1;//编号从1开始 scanf("%d",&newnode->mima);//键盘输入密码 newnode->next=head->next;p->next=newnode;p=newnode;
//      newnode->next=head->next;
//      head->next=newnode;
//      head=newnode;}
}
void show(Node *head,int size)
{int i=0;Node *prr=head->next;printf("每号位置对应的密码:");for(i=0;i<size;i++){printf("%d %d   ",prr->date,prr->mima);prr=prr->next;} putchar('\n');
}
void ysf(Node *head,int max)
{Node *p=head; printf("输出:"); while(p!=p->next)//循环终止条件:存在最后一个结点 {Node *pr=p->next;for(int i=1;i<max;i++){pr=pr->next;p=p->next;}//报数达到上限,退出循环printf("%d ",pr->date);//输出编号max=pr->mima;//变上限 p->next=pr->next;//删除结点 }printf("%d",p->date);
}
int main()
{Node *head=(Node *)malloc(sizeof(Node));int max,n;printf("请输入初始报数上限值:");scanf("%d",&max);printf("请输入参与人数:");scanf("%d",&n);create(head,n);show(head,n);ysf(head,max);return 0;
}

第一次写,有什么错误的地方希望大家指出来,栓Q!!!!

c语言循环单链表实现约瑟夫环问题相关推荐

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

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

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

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

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

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

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

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

  5. 循环单链表解决约瑟夫问题

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

  6. 单链表实现约瑟夫环(JosephCircle)(C语言)

    //使链表形成一个环 void FormCyc(PSListNode *pHead) {if (NULL == pHead){return;}else{PSListNode pNode = *pHea ...

  7. c语言判断单链表是否有环,如何判断链表有环并计算环的长度

    总体思路: 给出题目:检测单链表中是否存在环. 可以遍历这个链表,遍历过的节点标记为Done,如果当目前准备遍历的节点为Done的时候,那么存在环,否则准备检测的节点为Null时,遍历完成,不存在环. ...

  8. c语言pop逆置单链表,C语言实现单链表

    实现单链表的以下操作: list.h: #ifndef __LIST_H__ #define __LIST_H__ #include #include #include typedef int Dat ...

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

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

最新文章

  1. mysql判断视图是否存在_使用JDBC查询是否存在某表或视图,按月动态生成表
  2. security cookie
  3. 【MORE协议】基于MORE的改进协议设计的MATLAB仿真
  4. Python File(文件) 方法
  5. debug 标志位说明
  6. Python3只出现一次数字
  7. windows平台源码编译最新版openssl
  8. Linux/Android的cpu/memory/磁盘占用情况
  9. 项目质量管理在民航业中的应用
  10. java element string_Java StackTraceElement toString()方法
  11. X.509证书编码及解析
  12. 2021年下半年软考网络工程师真题答案解析
  13. CTO、技术总监、首席架构师的区别
  14. 力扣多线程练习----交替打印FooBar---打印零与奇偶数
  15. super是不是java中的标识符_java关键字super和this是什么?有什么区别?
  16. 30个Python最佳实践和技巧,你值得拥有~
  17. Python数据采集分析告诉你为何上海二手房你都买不起
  18. 【超全面】机器学习中的超参优化方法总结
  19. c语言 将结构体放在flash,stm32的内部flash读写操作(含结构体的保存)
  20. 一把通过CISA考试!老司机带你上车

热门文章

  1. 1001. Poker (思维 / 模拟)(2020年百度之星*程序设计大赛-初赛二)
  2. 电离辐射防护与辐射源安全基本标准_新版安全帽标准GB28112019头部防护 安全帽...
  3. 现代企业管理-计划和目标
  4. Unity Render Streaming 云渲染解决方案
  5. 计算机工程与应用 审稿费,计算机工程与应用杂志
  6. 7年时间从身无分文演变到资产近千万的我(下半部)
  7. 2003服务器文件自动只读,您不能查看或更改只读或文件夹在 Windows Server 2003、 Windows XP、 Windows Vista 中或在 Windows 7 中的系统属性...
  8. 项目:基于yolov5的舰船检测+pycharm+机器学习+图像检测
  9. 搭建论坛discuz
  10. CodeTop 1-20