约瑟夫环问题 C语言实现:求最后两个幸存者
以下是使用 C 语言实现约瑟夫环问题的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int number;
struct Node* next;
} Node;
Node* createCircularLinkedList(int n) {
Node* head = (Node*)malloc(sizeof(Node));
Node* current = head;
for (int i = 1; i <= n; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->number = i;
newNode->next = NULL;
current->next = newNode;
current = current->next;
}
current->next = head->next; // make it circular
free(head);
return current->next;
}
Node* eliminate(Node* head, int m) {
Node* current = head;
Node* prev = NULL;
while (current->next != current) {
for (int i = 1; i < m; i++) {
prev = current;
current = current->next;
}
prev->next = current->next;
Node* temp = current;
current = current->next;
free(temp);
}
return current;
}
int main() {
int n, m;
printf("Enter the number of people: ");
scanf("%d", &n);
printf("Enter the value of m: ");
scanf("%d", &m);
Node* head = createCircularLinkedList(n);
Node* survivor = eliminate(head, m);
printf("The last two survivors are: %d and %d\n", survivor->number, survivor->next->number);
return 0;
}
在这个代码中,我们先创建一个包含 n 个节点的单向循环链表,每个节点的值分别为 1 到 n。然后,我们按照约瑟夫环的规则,依次淘汰节点,直到只剩下最后一个节点为止。最后,我们输出最后两个幸存者的编号。
请注意,此代码假设输入的 n 大于等于 2,并且 m 大于等于 1。对于其他情况,可能需要进行额外的输入验证和错误处理。
原文地址: https://www.cveoy.top/t/topic/qlaU 著作权归作者所有。请勿转载和采集!