數據結構課程設計 約瑟夫環

題目:編號爲1,2… n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作爲報數的上限值m,從第一個人開始按順時針方向自1開始順序報數, 報到m時停止報數,報m的人出列,將他的密碼作爲新的m值,從他的順時針方向上的下一個開始重新從1報數,如此下去,直至所有人全部出列爲止,設計一個程 序求出出列順序。

//Josephus
#include<iostream>
using namespace std;

typedef struct LNode
{
    int num;   //編號
    int code; //密碼
    struct LNode *next;
}LNode;

void create(LNode *&tail, int m, int n)
{
    LNode *p, *q; //輔助節點
    LNode *head; //頭結點
    if(n < 1) //人數異常, 退出程序
    {
        cout << "Number error!" << endl;
        system("pause");
        exit(1);  
    }
   
    if(n == 1)
    {
        cout << "1" << endl;
        system("pause");
        exit(0);
    }

    //當 n >= 2 時

    head = new LNode;
    p = head;
    p -> num = 1;
    cin >> p ->code; //輸入第一個密碼

    for(int i = 2; i <= n; i++)
    {
        q = new LNode;
        p -> next = q;
        q -> num = i;     //寫入編號
        cin >> q -> code; //輸入其餘的密碼
        p = q;    //p指向已建鏈表的最後一個節點
    }

    tail = p;
    tail -> next = head;    //建立循環鏈表
}

void run(LNode *&tail, int m, int n)
{
    LNode *p, *q; //輔助節點
    p = tail;
   
    for(int i = 1 ; i <= n; i++)
    {
        for(int j = 1; j < m; j++) //p定位在出列者的前一人
        {
            p = p -> next;
        }
     
        q = p -> next;    //q指向出列者
            
        cout << q -> num; //輸出出列者的編號
        i < n ? cout << ' ' : cout << endl;
     
        m = q -> code;    //更新報數上限
        p -> next = q -> next;    //p指向出列者的下一人
     
        delete q; //刪除出列者節點
    }
}

int main()
{
    LNode *tt; //尾節點

    int m; //報數上限
    int n; //人數

    cout << "Input the number of people: ";
    cin >> n;
   
    cout << "Input the first code: ";
    cin >> m;

    create(tt, m, n);
    run(tt, m, n);

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章