#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int value;
struct Node *next;
} Node;
// 创建循环链表
Node* createCircularList(int n) {
Node *head, *tail;
for (int i = 1; i <= n; i++) {
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->value = i;
if (i == 1) {
head = tail = newNode;
tail->next = head; // 构成循环
} else {
tail->next = newNode;
newNode->next = head;
tail = newNode;
}
}
return head;
}
// 打印循环链表
void printCircularList(Node *head) {
Node *current = head;
do {
printf("%d ", current->value);
current = current->next;
} while (current != head);
printf("\n");
}
// 执行约瑟夫环
Node* josephus(Node *head, int m) {
Node *current = head;
while (current->next != current) {
for (int i = 1; i < m; i++) {
current = current->next;
}
Node *toKill = current->next;
printf("Eliminado: %d\n", toKill->value);
current->next = toKill->next;
free(toKill);
current = current->next;
}
printf("Ganador: %d\n", current->value);
return current;
}
int main() {
int n = 5; // 例如,5个人
int m = 2; // 例如,数数为2
Node *head = createCircularList(n);
printf("Inicial: ");
printCircularList(head);
Node *winner = josephus(head, m);
printf("Final: ");
printCircularList(winner);
return 0;
}