论坛首页 编程语言技术论坛

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

浏览 3940 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-16   最后修改:2008-12-16
C

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

 

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

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

 

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics