
作業社區
探索學習新天地,共享知識資源!
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; }




