約瑟夫環的陣列和鍊錶分別實現

2021-10-22 16:16:29 字數 2311 閱讀 2226

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

(1)n=7,7個人的密碼依次為:3,1,7,2,4,8,4,首先m值為6(正確的出列順序應為6,1,4,7,2,3,5)。

(2)n=9,9個人的密碼依次為:4,3,7,1,5,6,3,8,2,首先m值為4

(3)自己任選其它一組測試資料。

順序表結構

主要是用索引%人數m得出真實的位置

#include

#include

#define maxsize 100

typedef

struct cir *list;

struct cir

;void

init

(list &l)

void

(int x, list &l)

l->pw[l-

>last+1]

=x; l-

>isdeq[l-

>last+1]

=0;//出隊全部初始為0

l->last++

;//表長加一

return;}

void

add(

int n, list &l)

intmain()

int m;

printf

("輸入開始第乙個報數值m:");

scanf

("%d"

,&m)

;int index=-1

;printf

("出列順序:");

while

(l->last >=0)

if(m ==1)

m--;}

}free

(l);

return0;

}

執行截圖

鍊錶結構

使用指標遍歷單向迴圈鍊錶,每當報數到m值時,刪除當前指標節點,更改m值為刪除人的密碼,修改指標的為刪除節點的前乙個節點。

#include

#include

typedef

struct lnode *list;

struct lnode

;//建立空鍊錶 只有頭指標

list init()

//新增節點方法

list add

(list &l,

int num)

//尾節點的下一跳指向頭結點下一跳,形成迴圈鍊錶

flag -

>next = head-

>next;

//返回頭結點

return head;

}list deletenode

(list &lbefore,

int&m)

//修改p->q->next 改為 p->next

q = p -

>next;

p->next = q-

>next;

//輸出刪除節點的序號,更改m值為刪除節點的密碼 ,釋放刪除節點

printf

("%d "

,q->num)

; m = q -

>data;

free

(q);

lbefore = p;

//返回刪除節點的前乙個節點

return lbefore;

}game

(list &l,

int m,

int n)

//輸出最後乙個人的密碼

printf

("%d"

,l->num);}

intmain()

執行截圖:

約瑟夫環 陣列與鍊錶實現

約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列.1 陣列實現 void josepharrary int a,int ...

鍊錶實現約瑟夫環

約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依 此規律重複下去,直到圓桌周圍的人全部出列。實現 include using namespace ...

迴圈鍊錶實現約瑟夫環

約瑟夫問題 有n個人圍坐一圈,從第k個人開始數,數到m的那個人出隊。知道最後乙個人出隊。有11個人,從第2個人開始數,數到3的那個人出隊。如下簡圖 這裡有兩個關鍵 1 建立迴圈佇列 不能有頭結點 2 隔m 1步取出該節點 程式如下 include using namespace std typede...