每日一句,送给最珍贵的你: 学会适应不同的环境,与环境一起改变与否,将决定你开启一场怎样的人生!
题目描述
n 个人围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
输入格式
输入两个整数 n,m。
输出格式
输出一行 n个整数,按顺序输出每个出圈人的编号。
输入输出样例
输入
10 3
输出
3 6 9 2 7 1 8 5 10 4
源代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
}ListNode;
typedef ListNode *LinkList;
LinkList InitList (int n,LinkList L);
LinkList ListDelete(int n,int m,LinkList L);
int main() {
LinkList L;
int n,m;
scanf("%d %d",&n, &m);
L=InitList(n,L);
L=ListDelete(n,m,L);
//return 0;
}
LinkList InitList (int n,LinkList L) {
ListNode *p, *q;
int i;
L = (ListNode *) malloc(sizeof(ListNode));
q=L;//q为临时变量,将头节点赋值给q
for (i = 1; i <= n; i++) {
p = (ListNode *) malloc(sizeof(ListNode));
p->data =i;//初始化p的data
q->next=p;//将q指向p的首地址
q=p;//p为尾结点,将p赋值给临时变量q
}
p->next=L->next;//使最后一个结点指向第一个结点,使之构成一个循环
return L;
}
LinkList ListDelete(int n,int m,LinkList L){
int i,l;
ListNode *p, *q;
p=L;
for(i=1;i<=n;i++){
for(l=1;l<m;l++){
p=p->next;//p是第l-1个(待删除项)
}
q=p->next;
p->next=q->next;
printf("%d ",q->data);
free(q);
L=p;
}
return L;
}
运行结果: