領卓教育 使用迴圈連結串列解決Josephu 問題
阿新 • • 發佈:2018-12-17
/Josephu 問題為:設編號為 1, 2, … n 的 n 個人圍坐一圈,約定編號為 k(1<=k<=n)的人從 1 開始報 數,數到 m 的那個人出列,它的下一位又從 1 開始報數,數到 m 的那個人又出列,依次類推,直到所有人出 列為止,由此產生一個出隊編號的序列。/ /*******************************************************************************/ #include <stdio.h> #include <string.h> #include <stdlib.h>
typedef struct Node { int index; struct Node *next; }Josephu; int Josephu_resolve(int n,int k) { int i,j ; Josephu *head ,*tavil; head = tavil = (Josephu *)malloc(sizeof(Josephu));
/*建立迴圈連結串列,並初始化*/ for(i = 1;i < n;i++ ) //注意這裡向連結串列的後面,插入的節點數要減1 { tavil->index = i; tavil->next = (Josephu *)malloc(sizeof(Josephu)); tavil = tavil->next; } tavil->next = head; tavil->index = i; /*外迴圈控制需要出佇列的人數*/ for(i = 1; i < n ; i++) { /*內迴圈控制每次從出佇列的編號*/ for(j = 1; j < k; j++) { tavil = head; head = head->next; }//迴圈結束時head所在位置就是應該出佇列的編號 tavil->next = head->next; printf("第 %d 個出佇列的學生的編號為 %3d\n",i+1,head->index); free(head);//使用完要釋放記憶體 head = tavil->next; } i = head->index; free(head); return i ;
} int main(int argc, const char *argv[]) { int count,num; printf(“輸入學生人數 >>”); scanf("%d",&count); printf(“輸入點名編號 >>”); scanf("%d",&num); printf(“最後點到的編號為:%d\n”,Josephu_resolve(count,num)); return 0; }