问题描述
编号为1,2,…,n的n个人按顺时针方向围坐在一张圆桌周围,每人持有一个密码(正整数)。一
开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数,报m的那
个人出列,将他的密码作为新的m值,从他顺时针方向的下一个人开始重新从1报数,数到m的那个人又出列;如
此下去,直至圆桌周围的人全部出列为止。要求按出列顺序输出n个人的编号。
输入
第一行输入两个整数,依次表示人数n和初始化密码m,以空格间隔。
第二行依次输入n个整数,分别表示n个人的密码,以空格间隔。
输出
按出列次序输出每个人的编号,以空格间隔。
代码段
定义结构体,包括密码,编号。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int num;
int mima;
struct node *next;
} node,*linklist;
进行链表的创建,用于储存用户密码,标号。
linklist tail(int i)
{
int j = 0;
linklist L;/*创建头指针*/
node *p,*r;/*创建用于循环的节点*/
L = (linklist)malloc(sizeof(node));
L->next = NULL;
r = L;
while(j < i)
{
p = (node *)malloc(sizeof(node));
scanf("%d",&p->mima);
p->num = j + 1;
r->next = p;
r = p;
j++;
}
r->next = L->next;
free(L);
return r;/*返回这个循环链表*/
}
创建一个进行查找,删除的函数。用于记录输出出列的人的密码,编号。
linklist bkspace(linklist L,int mima)
{
int mima1;
node *a,*b;
a = L->next;
b = L;
if(mima ==1){
L->next = a->next;
}
else{
for(int i = 1; i < mima; i++){
b = a;
a = a->next;
}
b->next = a->next;
}
printf("%d",a->num);
mima1 = a->mima;
free(a);
a = b->next;
while(a->next != a){
if(mima1 != 1){
for(int i = 1; i < mima1; i++){
b = a;
a = a->next;
}
}
else
{
}
printf(" %d",a->num);
mima1 = a->mima;
b->next = a->next;
free(a);
a = b->next;
}
printf(" %d",a->num);
}
主函数
int main(){
int i,j;
int mima;
linklist L;
node *p;
scanf("%d %d",&i,&mima);
L = tail(i);
bkspace(L,mima);
}
样例输入
7 20
3 1 7 2 4 8 4
样例输出
6 1 4 7 2 3 5