这是一个经典的约瑟夫环问题,可以使用链表来解决。以下是一个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; } void Josephus(int n, int m, Node* head) { Node* temp = head; while (n > 1) { for (int i = 1; i < m - 1; i++) { temp = temp->next; n--; } printf("Out: %d\n", temp->data); Node* toDelete = temp; temp = temp->next; free(toDelete); n--; } } int main() { Node* head = createNode(1); Node* temp = head; for (int i = 2; i <= 20; i++) { temp->next = createNode(i); temp = temp->next; } printf("Elimination order:\n"); Josephus(20, 5, head); return 0; } ``` 这段代码首先创建了一个包含20个节点的链表,每个节点的值代表人的编号。然后调用`Josephus`函数,按照约瑟夫环的规则淘汰人。在`Josephus`函数中,我们遍历链表,每经过m-1个人就淘汰下一个人,直到链表为空,即所有人被淘汰。 注意:这个代码假设链表的第一个节点是1号,而不是0号,因为题目中提到第一个人的编号为1。如果需要从0开始编号,只需在创建链表时从0开始即可。 [2024-07-21 11:08:32 | AI写代码神器 | 398点数解答]