1. 程式人生 > >約瑟夫環(使用C語言單向迴圈連結串列來解決)

約瑟夫環(使用C語言單向迴圈連結串列來解決)

題目描述
編號為1,2,…,n的n個人按順時針方向圍坐在一張圓桌周圍,每人持有一個密碼(正整數)。一

開始任選一個正整數m作為報數上限值,從第一個人開始按順時針方向自1開始報數,報到m時停止報數,報m的那

個人出列,將他的密碼作為新的m值,從他順時針方向的下一個人開始重新從1報數,數到m的那個人又出列;如

此下去,直至圓桌周圍的人全部出列為止。要求按出列順序輸出n個人的編號。

輸入
第一行輸入兩個整數,依次表示人數n和初始化密碼m,以空格間隔。

第二行依次輸入n個整數,分別表示n個人的密碼,以空格間隔。

輸出
按出列次序輸出每個人的編號,以空格間隔。
樣例輸入
7 20
3 1 7 2 4 8 4
樣例輸出
6 1 4 7 2 3 5


AC程式碼

#ifndef LIST_H
#define LIST_H

typedef struct node {
    int xuhao;
    int password;
    struct node * next;
}Node, *List;

#endif

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

int main(void)
{
    List head = (List)malloc(sizeof(Node));
    head->next
= head; List prev = head; //定義總人數與初始密碼 int numbers, firstPassword; //臨時數字 int password; scanf("%d%d", &numbers, &firstPassword); for (int i = 1; i <= numbers; i++) { scanf("%d", &password); List pnew = (List)malloc(sizeof(Node)); prev->next
= pnew; pnew->xuhao = i; pnew->password = password; pnew->next = head; prev = pnew; } List p = head->next; prev = head; while (head->next != head) { if (firstPassword != 0) { password = firstPassword; firstPassword = 0; } for (int i = 0; i < password - 1; i++) { if (p->next == head) { p = p->next; prev = prev->next; } p = p->next; prev = prev->next; } if (p->next == head) { List t = p; password = p->next->password; printf("%d ", p->xuhao); prev->next = head; prev = head; p = head->next; free(t); } else { password = p->password; printf("%d ", p->xuhao); prev->next = p->next; List t = p; p = p->next; free(t); } } printf("\n"); return 0; }