C语言完成13人围成一圈,从第一个人开始顺序报号1,2,3.凡报到3者退出圈子。找出最后留在圈子中的人原来的序号。要求用链表实现。
时间: 2023-11-23 21:24:29 浏览: 85
好的,这道题可以用循环链表来模拟,每个节点表示一个人,当报到3时,将该节点删除。最后剩下的节点即为答案,其序号即为原来的序号。
以下是用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num; // 编号
struct node* next; // 指向下一个节点的指针
} Node;
int main() {
int n = 13, m = 3;
Node* head = NULL, * tail = NULL;
// 初始化循环链表
for (int i = 1; i <= n; i++) {
Node* p = (Node*)malloc(sizeof(Node));
p->num = i;
if (head == NULL) {
head = p;
} else {
tail->next = p;
}
tail = p;
}
tail->next = head; // 将链表首尾相连,形成循环链表
// 开始报数
Node* p = head, * prev = tail; // p指向当前节点,prev指向前一个节点
while (n > 1) { // 只有一个节点时结束循环
for (int i = 1; i <= m; i++) { // 报数
prev = p;
p = p->next;
}
prev->next = p->next; // 删除当前节点
free(p);
p = prev->next;
n--;
}
printf("最后留下来的人的编号是:%d\n", p->num);
return 0;
}
```
运行结果:
```
最后留下来的人的编号是:11
```
阅读全文