问题描述:
设编号为1,2,3,……,n个人按顺时针方向围坐一圈,约定编号为k(1≤k≤n)的人按顺时针方向从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依此类推,直到所有人出列为止,由此产生一个出队编号的序列。试设计算法求出n个人的出列顺序。
基本要求:
程序运行时,首先要求用户指定人数n、第一个开始报数的人的编号k及报数上限值m,然后按照出列的顺序打印出相应的编号序列。
提示与分析:
由于报到m的人出列的动作对应着数据元素的删除操作,而且这种删除操作比较频繁,因此单向循环链表适于作为存储结构来模拟此过程。而且为了保证程序指针每一次都指向一个具体的数据元素结点,应使用不带头结点循环链表作为存储结构。相应地,需要注意空表与非空表的区别。
算法思路:
先创建一个含有n个结点的单循环链表,然后由第一个结点起从1开始计数(此时假设k=1),计到m时,对应结点从链表中删除,接下来从被删除结点的下一个结点重新开始从1开始计数,计到m时,从链表删除对应中,如此循环,直到最后一个结点从链表中删除,算法结束。
数据类型定义:
问题描述:
设编号为1,2,3,……,n个人按顺时针方向围坐一圈,约定编号为k(1≤k≤n)的人按顺时针方向从1开始报数,数到m的那个人出列