`
xusaomaiss
  • 浏览: 615383 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

用单向循环链表解决约瑟夫环问题

阅读更多

设有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个人围坐一圈”。可选数据结构与算法中的可选方案:队列,栈,线性表,串。队列,栈和串都不大合适。以线性表中的单向循环链表最合适。

 

      回想当时面试时,我使用的是数据组,面试者问我,为什么不使用链表?数组是可以解决问题,但相对麻烦些。思考一下,面试时,要多才考虑一下,这个考题背后的东西,最近一段在看《编程之美》,里面的思路很好,如果能达到书上描述的那样,碰到问题都抽丝剥茧,把能把复杂问题抽象化,简单化,那么编程的水平就能更上一层楼了。

      在下一篇中,我将写一下《编程之美》中关于数组右转的问题。

 

1
0
分享到:
评论

相关推荐

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

    用单向循环链表解决约瑟夫问题。使用c++语言,结构体,链表的操作。

    单向循环链表实现约瑟夫环.zip

    在提供的"单向循环链表实现约瑟夫环.txt"文件中,可能包含了具体的代码实现或者详细解释,包括节点定义、链表操作(如插入、删除)以及约瑟夫环算法的完整流程。通过阅读和理解这个文件,你可以深入学习如何将理论...

    java编写的循环链表来实现约瑟夫环

    循环链表 实现约瑟夫环 java 自己写的 测试通过 有注释

    用单向循环链表模拟约瑟夫环

    用C语言编写的约瑟夫环问题解决程序,利用单向循环链表存储结构模拟此过程

    用单向循环链表解决约瑟夫问题的算法优劣性分析.doc

    "用单向循环链表解决约瑟夫问题的算法优劣性分析" 约瑟夫问题是一类经典的算法问题,其核心思想是从n个人中选择一个幸运者,并且可以通过数学方法和模拟方法来解决。解决约瑟夫问题的关键是建立一个具有n个结点的...

    C/C++经典约瑟夫环问题——带头结点的单向循环链表

    本程序以C/C++语言实现,利用带头结点的单向循环链表来解决这个问题。这里我们将深入探讨相关知识点。 首先,**带头结点的单向循环链表**是链表的一种特殊形式。与普通的单向链表不同,它在第一个元素(头结点)...

    VC++采用单向循环链表实现约瑟夫环

    这个例子展示了如何使用VC++和单向循环链表来解决约瑟夫环问题。通过链表的循环结构,我们可以轻松地跟踪和修改链表中的节点,从而实现剔除过程。理解这个算法不仅有助于提升编程技巧,还有助于对数据结构和算法的...

    c++循环链表解决约瑟夫环问题

    通过上述C++代码实现了约瑟夫环问题的解决方案,该方案利用了单向循环链表来高效地模拟出题目的过程。不仅能够处理任意数量的参与者,而且能够根据不同的初始条件得出正确的出列顺序。这种实现方式简单明了,易于...

    基于单向循环链表的约瑟夫环设计.doc

    总结来说,约瑟夫环问题通过单向循环链表来解决,利用链表结构实现报数和删除节点的操作,有效地模拟了问题中的循环过程。循环链表的特性使得问题的处理更为直观和高效,为约瑟夫环问题提供了一种经典而实用的解决...

    利用单向循环链表存储结构模拟约瑟夫环

    约瑟夫环问题: 编号为1,2,3 n的n个人按顺时针方向围坐一圈,没人持有一个密码。一开始任选一个正整数作为报数上限值m,从第一人开始按顺时针方向报数,报到m停止。报m的人出列,将他的密码作为新的m的值,从他的...

    单向循环链表-约瑟夫问题

    单向循环链表-约瑟夫问题

    约瑟夫环单循环链表C语言实现

    题目要求使用C语言编程实现约瑟夫环问题,并通过单向循环链表来管理参与游戏的人。以下是具体的知识点解析: #### 知识点解析 ##### 1. 单向循环链表 单向循环链表是一种特殊的线性表存储结构,其中每个节点包含...

    循环链表实现约瑟夫环

    在计算机科学中,循环链表被广泛应用于各种算法和数据结构的设计,其中一个著名的应用就是约瑟夫环问题。 约瑟夫环问题是一个经典的理论问题,源于古罗马时期的传说。假设有一群人围成一个圈,从某个人开始报数,每...

    双向循环链表解决约瑟夫

    不再采用单向循环链表解决约瑟夫问题,而是双向循环链表解决约瑟夫,并采用一些技巧来解释使用说明,即教程,并且密码可以为正整数,也可以为负数

    利用单向循环链表存储结构模拟约瑟夫问题,按照出列的顺序印出每个人的编号。

    综上所述,这个程序通过使用单向循环链表作为存储结构,成功地模拟了约瑟夫问题,按照出列顺序打印每个人编号的过程。通过类的封装和模块化设计,使得代码可读性增强,也易于扩展和维护。对于理解和实现这类问题,这...

    单向循环链表(JAVA)

    类似约瑟夫环问题。有一群人组成一个圈。从头开始按照顺时针方向从1开始依次报数。报到到9的人就离开圈子。其左手边的人接着从1开始报数。依此进行,直到剩最后一个人为止。

    用C语言编写的约瑟夫环程序

    1. 使用单向循环链表存储结构模拟约瑟夫环。 2. 处理输入,接收初始的m值、n值和每个人对应的密码,建立链表。 3. 输出正确的出列顺序。 4. 提供测试数据,例如m的初值为20,n=7,每个人的密码分别为3、1、7、2、4、...

    PHP实现的基于单向链表解决约瑟夫环问题示例

    《PHP实现的基于单向链表解决约瑟夫环问题》 约瑟夫环问题,又称约瑟夫问题,是一个著名的理论...通过这种方式,PHP利用单向链表的数据结构和递归函数成功解决了约瑟夫环问题,展示了在编程中解决问题的灵活性和效率。

    约瑟夫环问题

    为了实现约瑟夫环问题,我们首先需要理解单向循环链表的基本操作,包括创建、打印、查找和删除。 1. **创建单向循环链表** - 创建一个不带头结点的单向循环链表,链表的每个结点包含数据域`data`和指向下一个结点...

Global site tag (gtag.js) - Google Analytics