• C语言实例解析精粹学习笔记——35(报数游戏)


    实例35:

      设由n个人站成一圈,分别被编号1,2,3,4,……,n。第一个人从1开始报数,每报数位m的人被从圈中推测,其后的人再次从1开始报数,重复上述过程,直至所有人都从圈中退出。

    实例解析:

      用链表求解本问题,先由n形成一个有n个表元组成的环,其中n个表元依此置值1~n。然后从环的第一个表元出发,连续略过m-1个表元,第m-1个表元的后继表元是第m个表元,将该表元从环中退出。接着再次从下一个表元出发,重复以上过程,直至环中表元都退出为止。

    程序:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 //定义表中表元
     5 struct ele{
     6     int no;           //表元的编号
     7     struct ele *link; //指向环的下一个表元的指针
     8 };
     9 
    10 int main()
    11 {
    12     int n,m,i;
    13     struct ele *h;   //表头指针 
    14     struct ele *u;   //用于指向表中下一个表元的指针
    15     struct ele *p;   //用于指向第m个表元的指针
    16 
    17     printf("Please input n&m:
    ");
    18     scanf("%d%d",&n,&m);
    19 
    20     h = (struct ele *)malloc(sizeof(struct ele)); //形成首表元
    21     u = (struct ele *)malloc(sizeof(struct ele)); 
    22     h->no = 1;
    23     /*形成剩下的n-1个表元*/
    24     for(i=2; i<=n; i++)
    25     {
    26         u->link = (struct ele *)malloc(sizeof(struct ele));//为下一个表元分配一个地址
    27         u = u->link; //将u指向先一个表元
    28         u->no = i;
    29     }
    30     u->link = h;  //末表元后继首元,形成环
    31     puts("
    The numbers of who will quit the cycle in turn are:");
    32     while(n)
    33     {
    34         for(i=1; i<m; i++)   //掠过m-1个表元
    35             u=u->link;
    36         p = u->link;
    37         u->link = p->link;
    38         printf("%4d",p->no);
    39         free(p);
    40         n--;
    41     }
    42     printf("
    
     Press any key to quit...
    ");
    43 
    44     //printf("Hello world!
    ");
    45     return 0;
    46 }
  • 相关阅读:
    烂泥:mysql修改本地主机连接
    烂泥:ESXI开启SNMP服务
    烂泥:【解决】VMware Workstation中安装ESXI5.0双网卡问题
    JS-日历签到
    CSS-文本(中,英)
    js-无缝向上滚动
    js-键盘回车搜索enter
    小程序-初次进入小程序的授权问题(授权更新后的完整步骤)button主动授权
    字蛛(font-spider)-单独压缩字体(解决页面少有的特殊字体的字体包引用)
    js-利用插件qrcode.min.js,前端实时生成二维码
  • 原文地址:https://www.cnblogs.com/llccbb1/p/9781405.html
Copyright © 2020-2023  润新知