
作业社区
探索学习新天地,共享知识资源!
浪潮君 的学生作业:
#include #include // ============================== // 结构体定义:单向链表节点结构 // ============================== typedef struct Node { int id; // 当前人的编号 struct Node* next; // 指向下一个人的指针 } Node; // ===================================================== // 函数:创建一个长度为 n 的单向循环链表(不带头结点) // 返回值:指向第一个节点(编号为 1)的指针 // ===================================================== Node* create_circle(int n) { Node *head = NULL, *prev = NULL; for (int i = 1; i id = i; // 设置编号 node->next = NULL; // 初始化 next if (!head) { head = node; // 第一个节点作为头指针 } else { prev->next = node; // 前一个节点指向当前节点 } prev = node; // 更新 prev 指针 } prev->next = head; // 构成循环链表(最后一个节点指向头节点) return head; } // ===================================================== // 函数:实现约瑟夫问题出列逻辑 // 参数: // n - 总人数 // k - 从第几个人开始数 // m - 每次报数到第几个人出列 // ===================================================== void josephus(int n, int k, int m) { Node* head = create_circle(n); // 创建循环链表 Node* prev = head; // 找到起始编号为 k 的节点:prev->next->id == k while (prev->next->id != k) { prev = prev->next; } Node* curr = prev->next; // curr 指向编号为 k 的节点 printf("出列顺序: "); while (n--) { // 从 curr 开始数 m-1 个,找到第 m 个出列者 for (int i = 1; i < m; i++) { prev = curr; curr = curr->next; } // 打印出列编号 printf("%d ", curr->id); // 删除 curr 节点(即出列的人) prev->next = curr->next; // 断开当前节点 free(curr); // 释放内存 curr = prev->next; // 继续从下一个人开始数 } printf("\n"); } // ================ // 程序主函数入口 // ================ int main() { int n = 8; // 总人数 int k = 3; // 从编号 3 开始数 int m = 4; // 数到第 4 个出列 josephus(n, k, m); // 执行约瑟夫出列过程 return 0; }




