c语言N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人重新开始报数,数到M的人出圈;…输出依次出圈的人的编号。N,M由键盘输入
时间: 2023-10-23 13:11:44 浏览: 191
下面是一份 C 语言代码,实现了你所描述的围成一圈报数的游戏:
```c
#include <stdio.h>
#include <stdlib.h>
struct node {
int id;
struct node *next;
};
int main() {
int n, m;
printf("请输入总人数和出圈间隔:");
scanf("%d %d", &n, &m);
// 构建初始循环链表
struct node *head = (struct node *) malloc(sizeof(struct node));
struct node *cur = head;
for (int i = 1; i <= n; i++) {
cur->id = i;
cur->next = (struct node *) malloc(sizeof(struct node));
cur = cur->next;
}
cur = head;
while (cur->next != head) {
cur = cur->next;
}
cur->next = head;
// 开始游戏
int count = 0;
while (n > 0) {
count++;
if (count == m) {
printf("%d ", head->id);
// 删除头结点
struct node *temp = head;
cur->next = head->next;
head = head->next;
free(temp);
n--;
count = 0;
} else {
cur = head;
head = head->next;
}
}
printf("\n");
return 0;
}
```
代码中使用了一个循环链表来代表围成一圈的人,每次数到 M 就删除头结点,并将头结点指向下一个人。
需要注意的是,由于循环链表的特殊性,我们需要在删除头结点时,修改尾结点的 next 指针,使其指向新的头结点。
阅读全文