迴圈鍊錶(約瑟夫環)

2021-06-08 18:07:21 字數 1031 閱讀 4459

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

要通過輸入n,m,k三個正整數,來求出列的序列。這個問題採用的是典型的迴圈鍊錶的

資料結構,就是將乙個鍊錶的尾元素指標指向隊首元素。 p->link=head

解決問題的核心步驟:(程式的基本演算法)

1.建立乙個具有n個鏈結點,無頭結點的迴圈鍊錶;

2.確定第1個報數人的位置;

3.不斷地從鍊錶中刪除鏈結點,直到鍊錶為空。

void josephus(int n,int k,int m) //n為總人數,k為第乙個開始報數的人,m為出列者喊到的數

/* p為當前結點 r為輔助結點,指向p的前驅結點 list為頭節點*/

linklist p,r,list; /*建立迴圈鍊錶*/

for(int i=0;i

p=(linklist)malloc(sizeof(lnode));

p->data=i;

if(list==null)

list=p;

else

r->link=p;

r=p;

p->link=list; /*使鍊錶迴圈起來*/

p=list; /*使p指向頭節點*/

/*把當前指標移動到第乙個報數的人*/

while(k--) r=p;p=p->link;

//刪除

/*迴圈地刪除佇列結點*/

while(p->link!=p)

for(i=0;i

r=p;

p=p->link;

r->link=p->link;

printf("被刪除的元素:%4d ",p->data);

free(p);

p=r->link;

printf("\n最後被刪除的元素是:%4d",p->data);

迴圈鍊錶應用 約瑟夫環

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

單向迴圈鍊錶 約瑟夫環

寫個約瑟夫環,檢驗一下自己的學習狀況.include define elemtype int typedef struct lnodesqlist void initlist sqlist l,elemtype n void round sqlist l,int m,int n int main v...

約瑟夫環問題(迴圈鍊錶)

這是一道比較經典的迴圈鍊錶問題,在華為上機筆試中也出現過。約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。includ...