1185: 猴子选大王(结构体专题)c语言实现代码
时间: 2023-07-30 17:10:13 浏览: 207
以下是猴子选大王的 C 语言实现代码,使用了结构体:
```c
#include <stdio.h>
#include <stdlib.h>
struct monkey {
int num; // 猴子编号
int next; // 指向下一个猴子的指针
int prev; // 指向前一个猴子的指针
};
int main() {
int n, m, i;
printf("请输入猴子总数n和报数m:");
scanf("%d%d", &n, &m);
// 初始化猴子链表
struct monkey* monkeys = (struct monkey*) malloc(n * sizeof(struct monkey));
for (i = 0; i < n; i++) {
monkeys[i].num = i + 1;
monkeys[i].next = (i + 1) % n;
monkeys[i].prev = (i - 1 + n) % n;
}
// 约瑟夫环计算
int count = 0;
int current = 0;
while (count < n - 1) {
// 找到第m个猴子
for (i = 0; i < m - 1; i++) {
current = monkeys[current].next;
}
// 删除猴子
monkeys[monkeys[current].prev].next = monkeys[current].next;
monkeys[monkeys[current].next].prev = monkeys[current].prev;
printf("%d号猴子出局\n", monkeys[current].num);
// 更新计数器和当前猴子
count++;
current = monkeys[current].next;
}
// 输出最后一只猴子
printf("选出的大王是%d号猴子\n", monkeys[current].num);
// 释放内存
free(monkeys);
return 0;
}
```
这个程序首先读入总猴子数 `n` 和报数 `m`,然后初始化一个双向循环链表,链表中每个节点对应一个猴子,猴子编号从 1 到 `n`。接着使用约瑟夫环算法,从链表中删除猴子,直到只剩下一只猴子为止。最后输出剩下的那只猴子的编号,即为大王。
需要注意的是,这个程序中的链表是用数组实现的,而不是用指针和动态内存分配实现的。这样做虽然会浪费一些内存,但是可以避免指针操作的复杂性,使程序更加简单易懂。
阅读全文