資料結構約瑟夫

2021-10-01 14:21:10 字數 2234 閱讀 4380

一.問題分析與任務定義

1.物件是什麼:

有n個人,每個人都有相應的密碼, 物件是乙個結構體,它的資料域包含兩個資料:數字和密碼。

2.要實現的功能:

從鍵盤上讀取每個人的密碼,和乙個初始密碼m,再以線性表的形式儲存到計算機中。

迴圈模擬報數出列過程。在行尾報完數字後,返回到行首,直到行中的元素個數為0

3.處理後結果如何顯示:

對於每乙個出列的人,列印他的編號

4.資料型別與演算法設計:

1)有乙個線性表l,其中儲存的每個元素都是包含數字和密碼的結構的例項。

2)每次按m減小l的容量,直到l的容量為0。

5.抽象資料型別設計:

資料物件:型別是乙個包含兩個整型變數number和password的結構體

資料關係:根據編號放入乙個線性結構,資料關係是編號前後相繼,最後一位返回到開頭

基本操作:

開乙個線性空間

獲取元素密碼。

刪除目標元素並列印其編號

詳細示例:m的初始值為20;n=7,7個人的密碼依次為:3,1,7,2,4,8,4,首先m值為6

(正確的輸出順序應為6,1,4,7,2,3,5)。

二.線性表adt設計

1.結構定義:

struct node

adt類定義

資料物件:d=

資料關係:r=

基本操作:

void

init()

;//初始化

void

movetostart()

;//回到鍊錶開頭

bool

(constelem&a)

;//向鍊錶尾部新增元素

void

next()

;//當前訪問位置向後移一位

void

getvalue()

;//獲得當前位置的元素

intlength()

;//返回鍊錶長度

void remove()://刪除當前元素

bool isend()://確定當前位置是否為尾部

三.詳細設計

演算法思想:

1.程式由三個模組組成

輸入模組void input(list&l),輸入n個人的密碼和初始密碼m

功能模組void joseph(list&l),此函式負責模擬報數出列

輸出模組void print(int &num)螢幕顯示出列結果

2.物理資料結構的實現

1)問題:約瑟夫環問題

2)抽象資料型別:線性表

3)物理資料結構型別:具有序列號和密碼兩個整型變數的結構體

4)由於它是乙個環,其中的元素是按順時針順序排列的,所以考慮乙個陣列或乙個鍊錶。因為它涉及刪除操作,所以選擇使用鍊錶,因為刪除操作的複雜度為0(1)。

3、輸入數字和密碼演算法步驟

a)從鍵盤上讀取整數n

b)從鍵盤上讀取n個整數,並根據輸入順序將它們新增到線性表的末尾。

c)輸入整數m作為起始密碼,

void輸入(list

&l)cin>>m;//輸入初始密碼m

4.報數出列的演算法步驟

a)初始化count變數,count用來報數

b)遍歷鍊錶l中的元素,到達尾部節點後返回到頭節點,報到密碼m時刪除元素並輸出元素序號,更新報數和密碼。如果到達尾部節點,則返回頭部節點並繼續操作,直到鍊錶中的元素數為0

void

joseph

(list

&l>

if(l.

isend()

)//如果當前為尾結點

l.movetostart()

;//返回到頭節點

else

//不為尾結點

l.next()

;//訪問下乙個元素

}}

5.輸出內容演算法步驟

接收乙個整形變數並輸出

print(int

&num)

四.演算法分析

程式由三個模組組成

輸入模組void input(list&l)時間複雜度為o(n)

功能模組void joseph(list&l)時間複雜度為o(n^2)

輸出模組void print(int&num)時間複雜度為o(1)

程式時間複雜度o(n^2)

資料結構 約瑟夫問題

約瑟夫問題 上課結束,大家聽說第一周沒有程式設計題目,立刻就被鄙視了,為了糾正這個錯誤,咱們本週就來做點簡單題目。本題要求用迴圈鍊錶實現 約瑟夫問題是乙個經典的問題。已知n個人 不妨分別以編號1,2,3,n 代表 圍坐在一張圓桌周圍,從編號為 k 的人開始,從1開始順時針報數1,2,3,順時針數到m...

資料結構 約瑟夫問題

約瑟夫問題是乙個經典的問題。已知n個人 不妨分別以編號1,2,3,n 代表 圍坐在一張圓桌周圍,從編號為k 的人開始,從1開始順時針報數1,2,3,順時針數到m 的那個人,出列並輸出。然後從出列的下乙個人開始,從1開始繼續順時針報數,數到m的那個人,出列並輸出,依此重複下去,直到圓桌周圍的人全部出列...

資料結構 約瑟夫環

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