以下是使用C语言解决约瑟夫环问题的代码:\n\nc\n#include <stdio.h>\n#include <stdlib.h>\n\ntypedef struct Node {\n int data;\n struct Node* next;\n} Node;\n\nNode* createCircularLinkedList(int n) {\n Node* head = NULL;\n Node* prev = NULL;\n \n for (int i = 1; i <= n; i++) {\n Node* newNode = (Node*)malloc(sizeof(Node));\n newNode->data = i;\n \n if (head == NULL) {\n head = newNode;\n }\n \n if (prev != NULL) {\n prev->next = newNode;\n }\n \n prev = newNode;\n }\n \n prev->next = head; // 将最后一个节点的next指针指向头节点,形成循环链表\n return head;\n}\n\nvoid printCircularLinkedList(Node* head) {\n if (head == NULL) {\n return;\n }\n \n Node* current = head;\n \n do {\n printf("%d ", current->data);\n current = current->next;\n } while (current != head);\n \n printf("\n");\n}\n\nvoid josephusSurvivor(int n, int m) {\n Node* head = createCircularLinkedList(n);\n Node* current = head;\n \n // 让current指向第m个节点的前一个节点\n for (int i = 0; i < m - 2; i++) {\n current = current->next;\n }\n \n // 依次删除第m个节点,直到只剩下两个节点\n while (current->next != current) {\n Node* nextNode = current->next;\n current->next = nextNode->next;\n printf("节点%d被删除\n", nextNode->data);\n free(nextNode);\n \n current = current->next;\n }\n \n printf("最后剩余的两个节点:%d 和 %d\n", current->data, current->next->data);\n}\n\nint main() {\n int n, m;\n printf("请输入总人数n:");\n scanf("%d", &n);\n printf("请输入报数m:");\n scanf("%d", &m);\n \n josephusSurvivor(n, m);\n \n return 0;\n}\n\n\n代码中的createCircularLinkedList函数用于创建一个包含n个节点的循环链表,printCircularLinkedList函数用于打印循环链表的节点数据。josephusSurvivor函数用于解决约瑟夫环问题,其中n表示总人数,m表示报数的数字。\n\n在main函数中,通过用户输入的方式获取n和m的值,然后调用josephusSurvivor函数求解最后剩余的两个节点。

约瑟夫环问题:C语言实现求最后剩余两个节点

原文地址: https://www.cveoy.top/t/topic/qlaC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录