杭電資料結構課程實踐 約瑟夫環

2021-10-12 16:33:26 字數 1986 閱讀 8076

約瑟夫環問題的一種描述是:編號為1,2,3,……,n的n個人按順時針方向圍坐一圈,每個人持有乙個密碼(正整數),一開始任選乙個正整數作為報數值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數,報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下乙個人開始重新從1報數,如此下去,直至所有人全部出列為止,試設計乙個程式求出出列順序。

【設計要求】

(1)採用雙向迴圈鍊錶儲存結構,描述線性表的抽象資料型別。

(2)寫一高效演算法,根據報數值m選擇指標的移動方向。

約瑟夫環問題仍為線性表的應用,解題過程大致如下:

(1)建立表的儲存結構,獲得初始m值。

(2)根據m值查詢出列資料元素的位置,刪除該資料元素並獲取新的m值。

(3)重複步驟(2)至表空。

下面是我的**

#include 

#include

static int length =0;

typedef int elemtype;

typedef struct dulnode dulnode,

*dulinklist;

dulinklist creatlist

(dulinklist l

)for

(int i =

2; i <= n; i++

) s-

>next =l;

l->prior = s;

returnl;

}//建立雙向迴圈鍊錶並賦初值

void

printflist

(dulinklist l

)printf

("\n");

}//列印出雙向迴圈鍊錶所有元素的初值

int main()

printf

("第%d個出列的位序是:%d\n"

, sum++

, q-

>locate)

; number = q-

>data;

//新一輪的密碼

p = q;

//替罪羊上場

q = q-

>next;

//q作為新一輪開始的「頭結點」

p->prior-

>next = p-

>next;

p->next-

>prior = p-

>prior;

//斷開需刪除的結點同時雙向連線斷開位置的前後元素

free

(p);

//釋放指標

length--;if

(length !=0)

residue = number % length;

//取餘

else

break;}

else

printf

("第%d個出列的位序是:%d\n"

, sum++

, q-

>locate)

; number = q-

>data;

p = q;

q = q-

>next;

//q作為新一輪開始的「頭結點」

p->prior-

>next = p-

>next;

p->next-

>prior = p-

>prior;

//斷開需刪除的結點同時雙向連線斷開位置的前後元素

free

(p);

//釋放指標

length--;if

(length !=0)

residue = number % length;

//取餘

else

break;}

}return0;

}

執行環境為windows 10作業系統,程式經過mingw gcc編譯器編譯,程式執行良好。

資料結構 約瑟夫環

問題描述 約瑟夫環問題的一種描述是 編號為1,2,n的n個人按順時針的方向圍坐一圈,每個人持有乙個密碼 正整數 一開始任選乙個正整數作為報數的上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他的順時針方向上的下乙個人開始重新報數,如此下...

杭電面試 資料結構

關鍵路徑是什麼 雜湊表的構造方法,hash表的特點 hash函式的特點以及如何處理衝突 hash表適合儲存什麼型別的資料 影響hash表平均查詢長度的因素?線性儲存和鏈式儲存的優缺點 線性表和鍊錶的優缺點 線性表儲存結構有哪些,優點缺點?最小生成樹有哪些演算法,簡單介紹並舉個例子說明,兩種演算法的優...

資料結構 約瑟夫環問題

實驗一線性表的應用 實驗目的和要求 通過實驗進一步理解線性表的邏輯結構和儲存結構,提高使用理論知識指導解決實際問題的能力,熟練掌握鍊錶的實際應用。主要內容 題目1 josephus環問題 問題描述 約瑟夫 joseph 問題的一種描述是 編號為1,2,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼...