
作业社区
探索学习新天地,共享知识资源!
cjozGV 的学生作业:
#include "stdio.h" #include "stdlib.h" #include "string.h" typedef int datatype_t; //定义链表节点结构 typedef struct Node{ datatype_t value; //节点的值,代表入的编号 struct Node* next; } Node; //创建包含n个节点的循环链表 Node* create_Circular_LinkedList(int n) { Node* head = NULL; // 链表头指针 Node* prev = NULL; // 用于跟踪前一个节点 for (int i = 1; i value = i; // 设置节点值 newNode->next = NULL; if (head == NULL) { head = newNode; // 第一个节点作为头节点 } else { prev->next = newNode; // 将前一个节点的next指向新节点 } prev = newNode; // 更新前一个节点为当前新节点 } if (prev != NULL) { prev->next = head; // 将最后一个节点的next指向头节点,形成循环 } return head; // 返回头节点 } void josephus(int n, int k, int m) { Node* head = create_Circular_LinkedList(n); // 创建循环链表 Node* current = head; // 当前节点指针 Node* prev = NULL; // 当前节点的前一个节点指针 // 移动到起始点:第k个节点 for (int i = 1; i < k; i++) { prev = current; current = current->next; } printf("出列顺序: "); // 当链表中不止一个节点时循环 while (current->next != current) { // 计数m-1次,找到要删除节点的前一个节点 for (int i = 1; i < m; i++) { prev = current; current = current->next; } // 输出当前要删除的节点值 printf("%d ", current->value); // 删除当前节点:将前一个节点的next指向当前节点的下一个节点 prev->next = current->next; // 保存当前节点以便释放内存 Node* temp = current; // 移动到下一个节点 current = current->next; // 释放当前节点的内存 free(temp); } // 输出最后一个节点 printf("%d\n", current->value); // 释放最后一个节点的内存 free(current); } int main() { int n = 8; // 总人数 int k = 3; // 起始位置 int m = 4; // 计数到m的人出列 josephus(n, k, m); // 调用约瑟夫函数 return 0; }




