围圈报数c语言编程,59、1334:【例2-3】围圈报数(A)

1334:【例2-3】围圈报数-AC

【例3】设有n个人依次围成一圈,从第1个人开始报数,

数到第m个人出列,然后从出列的下一个人开始报数,

数到第m个人又出列,…,如此反复到所有的人全部出列为止。

设n个人的编号分别为1,2,…,n,打印出列的顺序。

【算法分析】

本题我们可以用数组建立标志位等方法求解,

但如果用上数据结构中循环链的思想,

则更贴切题意,解题效率更高。

n人围成一圈,把一人看成一个结点,

n人之间的关系采用链接方式,

即每一结点有一个前继结点和一个后继结点,

每一个结点有一个指针指向下一个结点,

最后一个结点指针指向第一个结点。

这就是单循环链的数据结构。

当m人出列时,将m结点的前继结点指针指向m结点的后继结点指针,即把m结点驱出循环链。

1、建立循环链表。

当用数组实现本题链式结构时,

数组a[i]作为"指针"变量来使用,

a[i]存放下一个结点的位置。

设立指针j指向当前结点,则移动结点过程为j=a[j],

当数到m时,m结点出链,则a[j]=a[a[j]]。

当直接用链来实现时,则比较直观,

每个结点有两个域:一个数值域,一个指针域,

当数到m时,m出链,将m结点的前继结点指针指向其后继结点;

2、设立指针,指向当前结点,设立计数器,计数数到多少人;

3、沿链移动指针,每移动一个结点,计数器值加1,

当计数器值为m时,  则m结点出链,计数器值置为1。

4、重复3,直到n个结点均出链为止。

【参考程序】用数组实现链式结构

#include

#include

using namespace std;

//const int n=10,m=4;

//设有10个人,报到4的人出列

//int a[1001],j=n,k=1,p=0;

int a[10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值