1. 程式人生 > >領卓教育 使用迴圈連結串列解決Josephu 問題

領卓教育 使用迴圈連結串列解決Josephu 問題

/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; }