C语言实现:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
时间: 2023-12-23 15:44:34 浏览: 164
可以使用循环链表来模拟这个过程,具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num; // 编号
struct node* next; // 指向下一个节点的指针
} Node;
int main() {
int n = 0;
printf("请输入总人数n: ");
scanf("%d", &n);
// 创建循环链表
Node* head = (Node*)malloc(sizeof(Node));
head->num = 1;
Node* p = head;
for (int i = 2; i <= n; i++) {
Node* node = (Node*)malloc(sizeof(Node));
node->num = i;
p->next = node;
p = node;
}
p->next = head; // 链表首尾相连
int count = 0; // 报数计数器
Node* prev = p; // 初始化为链表尾部,方便删除第一个节点
p = head; // 从链表头部开始报数
// 开始报数,直到只剩下一个人
while (p->next != p) {
count++; // 每报一次数,计数器加1
if (count == 3) {
// 删除当前节点
count = 0;
printf("删除编号为%d的人\n", p->num);
prev->next = p->next;
Node* temp = p;
p = p->next;
free(temp);
} else {
prev = p;
p = p->next;
}
}
printf("最后留下的人的编号为%d\n", p->num);
return 0;
}
```
程序运行时先输入总人数n,然后创建一个编号为1到n的循环链表,每次从链表头部开始报数,当报数达到3时删除当前节点,直到只剩下一个人为止,输出最后留下的人的编号。
阅读全文