資料結構 迴圈鍊錶求解約瑟夫環問題

2021-06-28 23:45:06 字數 1664 閱讀 7153

開啟部落格,竟然有兩個多月沒更新部落格了。最近一直在忙著準備實習招聘,所以沒有學習什麼android的新的東西,而是在學習招聘中最被重視之一的資料結構與演算法,而自己又非科班出身,哎......也許沒那麼難,加油!另外,對於這個部落格,我是想專門寫一些安卓的知識方便自己回顧還有比我新手的來參考的,就像我收藏的很多專門講android的部落格那樣。終有一天時機到了,會推倒重寫這個blog!

約瑟夫環(

約瑟夫問題

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

一看到這個問題就想到用迴圈鍊錶來實現,貼出個人寫的**,思路也體現在**中咯。

/*

* 約瑟夫環問題

*/#include "stdafx.h"

#include "malloc.h"

#include "stdio.h"

/*迴圈鍊錶結點*/

typedef struct listnode

listnode;

listnode *createlist(int n);

listnode *removelist(listnode *p);

int josephus(int number, int start, int loop);

int main(int argc, char* argv)

/** 功能:建立乙個n個結點的迴圈鍊錶,鍊錶

* 資料域即為約瑟夫環的編號,從1開始遞增

*/listnode *createlist(int n)

listnode *head = (listnode *)malloc(sizeof(listnode));

listnode *p;

head->number = 1;

head->next = head;

p = head;

for(int i = 1; i < n; i++)

return head;}/*

* 功能:刪除某個結點

* 引數:被刪除結點的指標

*/listnode *removelist(listnode *p)

/** 功能:求解約瑟夫環問題

* 引數:number 環的大小; start 開始的編號; loop 走的步數

* 返回:約瑟夫環的解

*/int josephus(int number, int start, int loop)

if(loop < 1) // 走的步數至少為1

listnode *one = createlist(number); // 建立乙個迴圈鍊錶

listnode *p = one;

for(int i = 1; i < start; i++)

while(p->next != p) // 迴圈到最後乙個就是自己啦,那就是解啦

listnode *s = p->next; // 要刪除的結點

p->next = s->next; // 把錶鏈上

} return p->number;

}

希望可以給研究約瑟夫環問題沒有頭緒的人一點參考吧(*^_^*) …

用迴圈鍊錶求解約瑟夫環問題

約瑟夫環問題 已知 n 個人 n 1 圍坐一圓桌周圍,從 1 開始順序編號,從序號為 1 的人開始報數,順時針數到 m 的那個人出列。下乙個人又從 1 開始報數,數到m 的那個人又出列。依此規則重複下去,直到所有人全部出列。請問最後乙個出列的人的初始編號。輸入輸出 輸入人數 n,所報數 m,輸出最後...

利用迴圈鍊錶求解約瑟夫問題

這題其實就是約瑟夫問題換了個 皮。用迴圈鍊錶解決的話思路最清晰,如下,注意看注釋的解釋。using system.collections.generic class circlenode 建立迴圈鍊錶節點 class solution temp.next head 迴圈結束,所有節點已經插入,則讓t...

資料結構 迴圈鍊錶,約瑟夫環

一 迴圈鍊錶 include stdio.h include stdlib.h typedef struct node node 初始化迴圈鍊錶 void ds init node pnode 初始化迴圈鍊錶,pnode 鍊錶上 else 返回結點所在位置 int ds search node pn...