/1.约瑟夫环 //任务:一堆猴子都有编号,编号是1,2,3 ... n, 这群猴子(n个)按照1 ~n的顺序围坐一圈,从第1开始数, //每数到第m个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。请设计算法编写程序输出为大王的猴子的编号。C语言单向循环链表
时间: 2024-03-18 14:41:45 浏览: 174
约瑟夫环实现编号是1,2,……,n的n个人按照顺时针方向围坐一圈
5星 · 资源好评率100%
好的,以下是使用C语言实现的单向循环链表解决约瑟夫环问题的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int val;
struct Node* next;
} Node;
int findKing(int n, int m) {
// 创建单向循环链表
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;
// 删除节点直到链表中只剩下一个节点
Node* curr = head;
while (curr->next != curr) {
for (int i = 1; i < m; i++) {
curr = curr->next;
}
curr->next = curr->next->next;
}
int king = curr->val;
// 释放链表的内存
free(curr);
curr = NULL;
Node* tmp = head;
while (tmp != NULL) {
head = tmp->next;
free(tmp);
tmp = head;
}
return king;
}
int main() {
int n = 5; // 猴子总数
int m = 3; // 数到第m个猴子出圈
int king = findKing(n, m);
printf("大王的编号为:%d\n", king);
return 0;
}
```
该程序使用了动态内存分配,需要在程序结束时手动释放链表的内存以避免内存泄漏。
阅读全文