約瑟夫環問題的一種描述是:編號為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個人按順時針方向圍坐一圈,每人持有乙個密碼...