c语言使用结构体编写要从n只猴子中选出一位大王。它们决定使用下面的方法: n只猴子围成一圈,从1到n顺序编号。从第q只猴子开始,从1到m报数,凡报到m的猴子退出竞选,下一次又从退出的那只猴子的下一只开始从1到m报数,直至剩下的最后一只为大王。请问最后哪只猴子被选为大王。 【输入形式】 控制台输入三个整数n,m,q。 【输出形式】 输出最后选为大王的猴子编号。 【样例输入】 7 4 3 【样例输出】 4 【样例说明】 输入整数n = 7,m = 4,n = 3,输出4
时间: 2024-02-11 22:09:30 浏览: 115
好的,这次我来使用链表实现,以下是C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
// 定义链表结点
typedef struct Node {
int val; // 猴子编号
struct Node* next; // 下一个结点
} Node;
int main() {
int n, m, q;
scanf("%d%d%d", &n, &m, &q);
// 构建循环链表
Node* head = (Node*)malloc(sizeof(Node));
head->val = 1;
Node* tail = head;
for (int i = 2; i <= n; i++) {
Node* node = (Node*)malloc(sizeof(Node));
node->val = i;
tail->next = node;
tail = node;
}
tail->next = head; // 将链表首尾相连
// 找到从第q个猴子开始
Node* current = head;
while (current->val != q) {
current = current->next;
}
// 循环报数,删除猴子,直到只剩下最后一只猴子
while (current->next != current) {
// 报数
for (int i = 1; i < m - 1; i++) {
current = current->next;
}
// 删除猴子
Node* to_delete = current->next;
current->next = to_delete->next;
printf("%d ", to_delete->val); // 输出被删除的猴子编号
free(to_delete);
}
printf("%d", current->val); // 输出最后剩下的猴子编号
// 释放内存
current->next = NULL;
Node* temp = head;
while (temp != NULL) {
Node* tmp = temp;
temp = temp->next;
free(tmp);
}
return 0;
}
```
代码逻辑如下:
1. 读入n,m,q。
2. 构建循环链表,每个结点表示一只猴子,包括猴子的编号和下一个结点的指针。
3. 找到从第q个猴子开始,即从链表头开始遍历,直到找到编号为q的猴子。
4. 循环报数,删除猴子,直到只剩下最后一只猴子:
1. 从当前猴子的下一个猴子开始报数,报到第m-1只猴子,即要删除的猴子的前一个猴子。
2. 删除猴子,即将其从链表中删除,当前猴子的下一个猴子指向要删除的猴子的下一个猴子,然后释放要删除的猴子的内存。
3. 当前猴子变为要删除的猴子的下一个猴子。
4. 循环结束后,链表中剩下的最后一只猴子即为大王,输出其编号即可。
5. 释放内存,先将链表尾结点的next指针置为NULL,然后循环释放每个结点的内存,包括头结点。
注意:为了避免内存泄漏,需要在删除每个猴子之前先用一个指针to_delete记录要删除的猴子,然后将其从链表中删除,并释放内存。同时,在循环报数时,每次只需要报到m-1,因为要删除的猴子是当前猴子的下一个猴子。
阅读全文