#include <stdio.h>
#include <stdlib.h>
2.构建链表
// 链表节点定义
typedef struct Node {
int number; // 猴子的编号
int status; // 1表示在圈内,0表示出局
struct Node *next;
} Node;
3.创建新节点的函数
Node* createNode(int number) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->number = number;
newNode->status = 1; // 默认在圈内
newNode->next = NULL;
return newNode;
}
4.向链表末尾添加新节点的函数
void addNode(Node** head, int number) {
Node* newNode = createNode(number);
if (*head == NULL) {
*head = newNode; // 如果链表为空,新节点即为头节点
} else {
Node* current = *head;
while (current->next != NULL) {
current = current->next; // 移动到链表末尾
}
current->next = newNode; // 在末尾添加新节点
}
}
5.定义功能函数
// 猴子选大王的函数
Node* findMonkeyKing(int N, int M) {
Node* head = NULL; // 初始化链表为空
// 创建链表
for (int i = 1; i <= N; i++) {
addNode(&head, i);
}
Node* current = head; // 从头节点开始报数
while (head->next != head) { // 当链表长度大于1时继续报数
for (int count = 1; count < M; count++) {
current = current->next; // 报数到M-1
}
// 报到M的猴子出局
if (current->status == 1) {
current->status = 0; // 猴子出局
head = current->next; // 移除出局猴子
free(current); // 释放内存
current = head; // 重新从头节点开始报数
} else {
current = current->next; // 移动到下一个节点
}
}
// 返回最后剩下的小王的节点
return head;
}
6.主函数依旧是 定义输入 输入并接受 调用主函数 输出
// 主函数
int main() {
int N, M;
printf("请输入猴子的数量N和报数M:");
scanf("%d %d", &N, &M);
Node* king = findMonkeyKing(N, M);
printf("最后剩下的猴子的编号为:%d\n", king->number);
// 释放链表内存
Node* current = king;
Node* next;
while (current != NULL) {
next = current->next;
free(current);
current = next;
}
return 0;
}
这道题的确优点难度,有没有哪位大神有更好的思路?