约瑟夫环问题:C语言单向循环链表实现
约瑟夫环问题是一个经典的数学问题,可以使用单向循环链表来模拟。下面是用C语言实现的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
Node* createCircularLinkedList(int n) {
Node* head = createNode(1);
Node* current = head;
for (int i = 2; i <= n; i++) {
current->next = createNode(i);
current = current->next;
}
current->next = head;
return head;
}
void josephusCircle(Node* head, int m) {
Node* prev = head;
while (prev->next != head) {
prev = prev->next;
}
Node* current = head;
while (current->next != current) {
for (int i = 1; i < m; i++) {
prev = current;
current = current->next;
}
prev->next = current->next;
free(current);
current = prev->next;
}
printf('最后剩余的两个节点的值为:%d和%d\n', current->data, current->next->data);
}
int main() {
int n, m;
printf('请输入总人数n:');
scanf('%d', &n);
printf('请输入报数m:');
scanf('%d', &m);
Node* head = createCircularLinkedList(n);
josephusCircle(head, m);
return 0;
}
首先,我们定义了一个Node结构体,表示单向循环链表的节点。然后,我们实现了createNode函数,用于创建一个节点,并返回指向该节点的指针。
接下来,我们实现了createCircularLinkedList函数,用于创建一个包含n个节点的单向循环链表。该函数首先创建第一个节点,并将它作为头节点。然后,遍历n-1次,每次创建一个新节点,并将其添加到链表的末尾。最后,将最后一个节点的next指针指向头节点,形成循环。
然后,我们实现了josephusCircle函数,用于解决约瑟夫环问题。该函数接收一个头节点和一个报数m作为参数。首先,我们找到链表中最后一个节点的前一个节点,并将它存储在prev变量中。然后,我们使用current变量指向头节点,循环遍历链表,直到链表中只剩下一个节点。在每一轮循环中,我们使用for循环报数m次,然后将当前节点从链表中删除,并释放其内存。最后,我们打印出最后剩余的两个节点的值。
在main函数中,我们首先从用户输入读取总人数n和报数m。然后,我们调用createCircularLinkedList函数创建一个循环链表,并将其作为参数传递给josephusCircle函数来解决约瑟夫环问题。
运行程序,输入总人数和报数,即可得到最后剩余的两个节点的值。
原文地址: https://www.cveoy.top/t/topic/qlaP 著作权归作者所有。请勿转载和采集!