好玩的约瑟夫环:有M个人,编号分别为1到M,玩约瑟夫环游戏,最初时按编号顺序排成队列;每遍游戏开始时,有一个正整数报数密码N,队列中人依次围坐成一圈,从队首的人开始报数,报到N的人出列,然后再从出列的下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列,完成一遍游戏,所有出列的人形成新队列;游戏可能玩很多遍,每遍有新报数密码。求若干遍游戏完成后队列次序。题目输入包括若干个正整数(至少1个),第一个正整数为玩游戏人数M,后续每个正整数为每遍游戏报数密码,报数密码可能为1,题目要求按出队列顺序输出他们的编号。

输入样例:

10   3   5    2

输出样例:

   4   6   5   2   9   1   3   7   8  10

代码如下:

#include <stdio.h>
#include <stdlib.h>struct Node {int data;struct Node *next;
};
//createNew
struct Node *createNew()
{struct Node *p;p =  (struct Node *)malloc(sizeof(struct Node));p -> next = NULL;return p;};//build创建循环链表
void build (struct Node **pp, int m) {struct Node *phead, *pnew, *pold;phead = *pp;pold = phead;int i;for(i = 1; i <= m; i++) {pnew = createNew();pnew -> data = i;pold -> next = pnew;pold = pold -> next;}pold -> next = phead -> next;
}//append添加人数
void append(struct Node **pp1, struct Node **pp2, int n) {struct Node *phead1, *phead2, *pold, *pafter, *pnext;phead1 = *pp1;phead2 = *pp2;pold = phead1 -> next;pafter = pold -> next;pnext = phead2;while(phead1 -> next){if(n >= 3) {for(int i = 0; i < n - 2; i++) {pold = pold -> next;pafter = pold -> next;}}else if(n == 2) {pafter = pold -> next;}else if(n == 1) {pold = phead1;pafter = pold -> next;}//phead2未存储数据if(!phead2 -> next) {phead2 -> next = pafter;pnext = pnext -> next;}//printf("pnext = %d\n",pnext -> data);else {pnext -> next = pafter;pnext = pnext -> next;}pold -> next = pafter -> next;pold = pold -> next;//printf("pnext->next = %d\n",pnext -> data);
//printf("pold = %d\n",pold -> data);//只剩下一个人n >= 2跳出循环的条件if(pold == pold -> next) {pnext = pold;pnext -> next = NULL;break;}//n == 1跳出循环的条件if(n == 1) {if(pafter -> next -> data == phead2 -> next -> data) {pafter -> next = NULL;break;}}}
}//print
void print(struct Node *p, int m)
{for(int i = 0; i < m; i++) {printf("%4d",p -> next -> data);p = p -> next;}}void repeat(struct Node **pp) {struct Node *phead, *pnext;phead = *pp;pnext = phead -> next;while(pnext -> next) {pnext = pnext -> next;}pnext -> next = phead -> next;}//destroy
void destroy(struct Node *p)
{struct Node *pnext;while(p) {pnext = p -> next;free(p);p = pnext;}//printf("destroyed!");
}int main()
{//新建两个链表的头节点struct Node *phead1, *phead2;phead1 = createNew();phead2 = createNew();//输入人数int m;scanf("%d",&m);//创建循环链表build(&phead1,m);//第一次游戏int x;scanf("%d",&x);append(&phead1,&phead2,x);//循环游戏while(getchar() == ' ') {phead1 = phead2;repeat(&phead1);phead2 = createNew();scanf("%d",&x);append(&phead1,&phead2,x);}//打印print(phead2,m);//销毁destroy(phead2);return 0;
}

【C语言】循环链表解决约瑟夫环问题相关推荐

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

    约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? "约瑟夫环是一个数学的应用问题:已知 ...

  2. 使用循环链表解决约瑟夫环问题

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

  3. 《恋上数据结构第1季》单向循环链表、双向循环链表以及约瑟夫环问题

    循环链表(CircleList) 链表的接口设计 单向循环链表 单向循环链表完整源码 双向循环链表 双向循环链表完整源码 双向循环链表解决约瑟夫环问题 如何发挥循环链表的最大威力? 静态链表 数据结构 ...

  4. C语言使用数组和循环解决约瑟夫环问题

    C语言使用数组和循环解决约瑟夫环问题 约瑟夫入狱,监狱内共有 33 个犯人.某日 33 名犯人围成一圈,从第一个犯人开始报数,报到数字 7 的犯人出列, 被枪毙,下一名犯人重新从 1 开始报数.依次类 ...

  5. c语言循环链表约瑟夫问题的时间复杂度,用单向循环链表解决约瑟夫问题算法优劣性分析.doc...

    用单向循环链表解决约瑟夫问题算法优劣性分析 用单向循环链表解决约瑟夫问题算法优劣性分析 摘要: 首先由简单问题引入约瑟夫问题,然后用单向循环链表解决约瑟夫问题,最后对模拟方法及数学方法的优劣性进行分析 ...

  6. 用java解决约瑟夫循环问题,Java实现循环列表解决约瑟夫环问题

    约瑟夫环:共有n个人围成一圈,从1开始报数,数到m的人出圈,求最后幸运者序号?? 下面用Java实现循环列表解决这个问题: package com.iteye.ljmdbc7a; import jav ...

  7. java实现环形链表解决约瑟夫环问题

    什么是环形链表? 环形链表就是单向链表的基础上让链表的首尾相连,形成一个环,这就是一个循环链表. 什么是约瑟夫环问题? 约瑟夫环如下: 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数, ...

  8. PHP解决约瑟夫环问题

    PHP解决约瑟夫环问题 一.总结 二.PHP解决约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到 ...

  9. C语言小练习——约瑟夫环问题

    问题描述:使用数组法解决约瑟夫环问题 约瑟夫入狱,监狱内共有33个犯人.某日33名犯人围成一圈,从第一个犯人开始报数,报到数字7的犯人出列,被枪毙,下一名犯人重新从1开始报数.依次类推,直至剩下最后1 ...

最新文章

  1. (转)spring源码解析,spring工作原理
  2. Java Web整合开发(14) -- Struts 1.x 概述
  3. SQL语句行列转换两种方法 case ...when 和pivot函数应用
  4. 【Ajax】创建并封装
  5. 服务器虚拟机密度,服务器整合:虚拟机密度大未必是好事
  6. oracle 本年1月1号 yy,ORACLE 日期函数
  7. 获取响应里面的cookie的方法
  8. mac mysql root不能登陆_Mac下新安装的MySQL无法登陆root用户解决方法
  9. x264源码下载信息
  10. cad图形不见了怎么办_CAD软件常见问题解答,CAD中的工具栏不见了怎么办?如何清理图形...
  11. ! [rejected] master - master (fetch first)问题的解决方案
  12. 在威联通NAS上实现硬盘独立休眠
  13. 编程小TIPS:使用函数式风格Either来编程
  14. [ECE]模拟试题-4
  15. linux oracle开启监听服务器,linux服务器启动oracle监听端口
  16. 系统架构设计师-软件水平考试(高级)-论文-架构风格
  17. RGB颜色空间与Lab颜色空间区别与联系(附转换代码)
  18. java程序占用cpu100%问题查找方案
  19. 开源我的3D库WxGL:40行代码将疫情地图变成三维地球模型
  20. 适配Android Q拍照和读取相册图片

热门文章

  1. After Effects Guru: Time-Lapse 3D Motion and Compositing After Effects Guru:延时3D运动和合成 Lynda课程中文字幕
  2. 计算机的利弊优秀英语范文,2017下半年大学英语六级作文范文:电脑利弊
  3. 亚马逊接口NextToken分页调用时AuthFailure问题的解决
  4. 解决sublime快捷键回车换行问题
  5. 计算机事业单位简答题5
  6. Rector模式介绍
  7. .NET加密打包教程一(.NetReactor加密)
  8. el-upload使用http-request上传时UI跳动
  9. 有关ThinkPad T430、X230如何禁用触控板小红帽的问题
  10. php 模拟登录支付宝,PHP实现支付宝登录