約瑟夫環 迴圈鍊錶實現

2021-08-28 04:45:06 字數 1129 閱讀 9081

題目:

約瑟夫環的一種描述為 編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼(正整數)。

一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。

報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下乙個人開始重新從1報數,如此下去,直到所有人全部出列為止。

測試資料:

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

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

編譯環境:vc 6.0

typedef struct listnode

listnode,*link;//link為指向結構體listnode的指標型別

typedef structsqlist;

void initlist(sqlist &list)

int listinsert(sqlist &list,int i,int num)

q=(link)malloc(sizeof(listnode));

q->listnum=i;

q->data=num;

q->out=1;

q->next=p->next;p->next=q;

if(i==++list.len)

list.rear=q;

return ok;

}int locateelem(sqlist list)

if(r==s)

r=list.head;

r=r->next;

} return 0;

}void printlist(sqlist list)/*用於測試資料是否儲存入單鏈表*/

}int main()

dowhile(m<=0);

//printlist(list2);printf("\n");

printf("出列順序為:");

flag=locateelem(list2);

} printf("\n");

return 0;

}

迴圈鍊錶實現約瑟夫環

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

約瑟夫環,迴圈鍊錶實現

約瑟夫環的定義就不再贅述,直接上 如果朋友能看完這個 相信你能理解接下面這個小故事。有個人想從這個世界上消失,但是他又不想死,他想到了乙個辦法,他可以把另外乙個人殺了,然後再用這個人的身份生活下去。這個小故事與約瑟夫環無關 include include struct node int main e...

迴圈鍊錶實現約瑟夫環

首先我們先上圖幫助理解 環狀順序佇列 top為隊首指標 rear為隊尾指標 我們需要注意,順序佇列在判斷陣列中資料是否存滿時,會出現下面情況 由上我們發現 我們為了區分二者,最簡單的解決辦法是 犧牲掉陣列中的乙個儲存空間 迴圈佇列的操作 i.size為順序佇列申請的空間大小 ii.q 為資料集合 出...