设有n个人围坐一圈,现以某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人又出列,如此下去,直到所有人都出列为止.按出列顺序输出.
这段代码是从网上找来的,在此特别说明!!!!!
#include "stdlib.h"
struct ele {
int no;
struct ele *link;
} main() {
struct ele *h, *u, *p;
int n, m, i;
printf("Please input n&m:\n");
scanf("%d%d", &n, &m);/*输入n和m*/
h = u = (struct ele *) malloc(sizeof(struct ele));/*形成首表元*/
h->no = 1;
for (i = 2; i <= n; i++)/*形成其余的n-1个表元*/
{
u->link = (struct ele *) malloc(sizeof(struct ele));
u = u->link;
u->no = i;/*第i个表元置编号i*/
}
u->link = h;/*末表元后继首表元,形成环*/
puts(
"\nThe numbers of who will quit the cycle in turn are:");
while (n) {
for (i = 1; i < m; i++)
/*掠过m-1个表元*/
u = u->link;
p = u->link;/*p指向第m个表元*/
u->link = p->link;/*第m个表元从环中脱钩*/
printf("%4d", p->no);
free(p);/*释放第m个表元占用的空间*/
n--;
}
printf("\n\n Press any key to quit...\n");
getchar();
}
当碰到问题,首先考虑这个问题是怎样的类型,第二从解决列表中选择中最合适的方案.以这个问题为例:问题中是一个循环性质,关键点“有n个人围坐一圈”。可选数据结构与算法中的可选方案:队列,栈,线性表,串。队列,栈和串都不大合适。以线性表中的单向循环链表最合适。
回想当时面试时,我使用的是数据组,面试者问我,为什么不使用链表?数组是可以解决问题,但相对麻烦些。思考一下,面试时,要多才考虑一下,这个考题背后的东西,最近一段在看《编程之美》,里面的思路很好,如果能达到书上描述的那样,碰到问题都抽丝剥茧,把能把复杂问题抽象化,简单化,那么编程的水平就能更上一层楼了。
在下一篇中,我将写一下《编程之美》中关于数组右转的问题。
分享到:
相关推荐
用单向循环链表解决约瑟夫问题。使用c++语言,结构体,链表的操作。
在提供的"单向循环链表实现约瑟夫环.txt"文件中,可能包含了具体的代码实现或者详细解释,包括节点定义、链表操作(如插入、删除)以及约瑟夫环算法的完整流程。通过阅读和理解这个文件,你可以深入学习如何将理论...
循环链表 实现约瑟夫环 java 自己写的 测试通过 有注释
用C语言编写的约瑟夫环问题解决程序,利用单向循环链表存储结构模拟此过程
"用单向循环链表解决约瑟夫问题的算法优劣性分析" 约瑟夫问题是一类经典的算法问题,其核心思想是从n个人中选择一个幸运者,并且可以通过数学方法和模拟方法来解决。解决约瑟夫问题的关键是建立一个具有n个结点的...
本程序以C/C++语言实现,利用带头结点的单向循环链表来解决这个问题。这里我们将深入探讨相关知识点。 首先,**带头结点的单向循环链表**是链表的一种特殊形式。与普通的单向链表不同,它在第一个元素(头结点)...
这个例子展示了如何使用VC++和单向循环链表来解决约瑟夫环问题。通过链表的循环结构,我们可以轻松地跟踪和修改链表中的节点,从而实现剔除过程。理解这个算法不仅有助于提升编程技巧,还有助于对数据结构和算法的...
通过上述C++代码实现了约瑟夫环问题的解决方案,该方案利用了单向循环链表来高效地模拟出题目的过程。不仅能够处理任意数量的参与者,而且能够根据不同的初始条件得出正确的出列顺序。这种实现方式简单明了,易于...
总结来说,约瑟夫环问题通过单向循环链表来解决,利用链表结构实现报数和删除节点的操作,有效地模拟了问题中的循环过程。循环链表的特性使得问题的处理更为直观和高效,为约瑟夫环问题提供了一种经典而实用的解决...
约瑟夫环问题: 编号为1,2,3 n的n个人按顺时针方向围坐一圈,没人持有一个密码。一开始任选一个正整数作为报数上限值m,从第一人开始按顺时针方向报数,报到m停止。报m的人出列,将他的密码作为新的m的值,从他的...
单向循环链表-约瑟夫问题
题目要求使用C语言编程实现约瑟夫环问题,并通过单向循环链表来管理参与游戏的人。以下是具体的知识点解析: #### 知识点解析 ##### 1. 单向循环链表 单向循环链表是一种特殊的线性表存储结构,其中每个节点包含...
在计算机科学中,循环链表被广泛应用于各种算法和数据结构的设计,其中一个著名的应用就是约瑟夫环问题。 约瑟夫环问题是一个经典的理论问题,源于古罗马时期的传说。假设有一群人围成一个圈,从某个人开始报数,每...
不再采用单向循环链表解决约瑟夫问题,而是双向循环链表解决约瑟夫,并采用一些技巧来解释使用说明,即教程,并且密码可以为正整数,也可以为负数
综上所述,这个程序通过使用单向循环链表作为存储结构,成功地模拟了约瑟夫问题,按照出列顺序打印每个人编号的过程。通过类的封装和模块化设计,使得代码可读性增强,也易于扩展和维护。对于理解和实现这类问题,这...
类似约瑟夫环问题。有一群人组成一个圈。从头开始按照顺时针方向从1开始依次报数。报到到9的人就离开圈子。其左手边的人接着从1开始报数。依此进行,直到剩最后一个人为止。
1. 使用单向循环链表存储结构模拟约瑟夫环。 2. 处理输入,接收初始的m值、n值和每个人对应的密码,建立链表。 3. 输出正确的出列顺序。 4. 提供测试数据,例如m的初值为20,n=7,每个人的密码分别为3、1、7、2、4、...
《PHP实现的基于单向链表解决约瑟夫环问题》 约瑟夫环问题,又称约瑟夫问题,是一个著名的理论...通过这种方式,PHP利用单向链表的数据结构和递归函数成功解决了约瑟夫环问题,展示了在编程中解决问题的灵活性和效率。
为了实现约瑟夫环问题,我们首先需要理解单向循环链表的基本操作,包括创建、打印、查找和删除。 1. **创建单向循环链表** - 创建一个不带头结点的单向循环链表,链表的每个结点包含数据域`data`和指向下一个结点...