任务描述
本关任务:n个人围成一圈,按顺序从1到n进行编号,初始时从编号为1的人开始按1、2、3......顺序报数,报数到m(1≤m≤n)时该人退出到圈外,接着从出圈时的下一个位置开始从1开始重新进行报数,报数到m时的人再退出到圈外,以此类推。 请按退出顺序输出每个退出人的原编号。
编程要求
根据提示,在右侧编辑器补充代码,补充完成函数void Jesuphus(LinkNode *&L, int n, int m),其中L为不带附加头结点的循环单链表的头指针,n为圈中人的个数,m为报数的值。
测试说明
平台会对你编写的代码进行测试:
输入格式
输入只有一行,为n和m。1≤n≤3000,1≤m≤n。
输出格式
输出包含一行,为退出到圈外的人的编号,编号之间以一个空格分隔。
样例输入1
10 3
样例输出1
3 6 9 2 7 1 8 5 10 4
样例输入2
7 4
样例输出1
4 1 6 5 7 3 2
#include "linklist.h"
/**
* 约瑟夫环:L为不带附带头结点的循环单链表的头指针
*/
void Jesuphus(LinkNode *&L, int n, int m)
{
//请在下面编写代码
/******************Begin******************/
LinkNode *r,*p;
p = L;
while(p->next!=p){//只有一个节点的时候,循环结束
for(int i = 1;i < m;i++){
r = p;//r是p的前一个结点
p = p->next;
}
printf("%d ",p->data);
r->next = p->next;
p=p->next;
}
printf("%d",p->data);
/*******************End*******************/
}
//尾插法建立循环单链表
void CreateListR(LinkNode *&L, ElemType a[], int n)
{
LinkNode *s, *r;
L = (LinkNode *)malloc(sizeof(LinkNode)); //创建头结点
L->data = a[0];
L->next = NULL;
r = L; //r始终指向终端结点,开始时指向头结点
for (int i = 1; i < n; i++)
{
s = (LinkNode *)malloc(sizeof(LinkNode)); //创建新结点s
s->data = a[i];
r->next = s; //将结点s插入结点r之后
r = s;
}
r->next = L; //形成循环单链表
}
//输出循环单链表
void DispList(LinkNode *L)
{
LinkNode *p = L;
while (p->next != L)
{
printf("%d ", p->data);
p = p->next;
}
printf("%d\n", p->data); //打印最后一个结点的值
}
以i计数,i==m时输出p->data;
循环链表的循环操作
for(int i = 1;i < m;i++){
r = p;
p = p->next;
}
因为循环链表已经设置好了每个节点元素的数值(1~n),只要删除节点就可以了。
删除节点操作:
r->next = p->next;
p = p->next;
如果有问题请指出哦~~~(✿◡‿◡)