习题8-4 报数 (20 分)
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。
本题要求编写函数,给出每个人的退出顺序编号。
其是这是一个约瑟夫序列,采用循环链表即可解决(不带头结点)。
代码如下:
//循环单链表
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct node{
int num;
struct node *next;
}child;
typedef child* list;
list Creatlist(list &L,int n)
{
list p,end;
L=(list)malloc(sizeof(child));
L->num=1;
end=L;
for (int i=1;i<n;i++) {
p=(list)malloc(sizeof(child));
p->num=i+1;
end->next=p; //尾插法
end=p;
}
end->next=L; //尾结点链到头部
}
void CountOff(int n,int m) //依次出列
{
list p,q,L;
int k;
Creatlist(L,n);
//开始剔除操作
for (int i=1;i<=n;i++) {
k=1;p=L;
while (k<m-1) {
k++;
p=p->next;
}
q=p->next;
printf("%d ",q->num);
p->next=q->next;
free(q);
L=p->next;
}
}
int main()
{
int n,m;
cin>>n>>m;
CountOff(n,m);
}