数据结构-循环单链表之约瑟夫问题
生活随笔
收集整理的這篇文章主要介紹了
数据结构-循环单链表之约瑟夫问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
約瑟夫問題的由來:
????據說著名猶太歷史學家 Josephus有過以下的故事:在羅馬人占領喬塔特后,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然后再由下一個重新報數,直到所有人都自殺身亡為止。然而Josephus 和他的朋友并不想遵從,Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲??磥砉φn學得好關鍵時刻可以救命啊!!! 哈哈。。。
簡單實現了一個單鏈表以對約瑟夫問題的求解。
/* function:初始化約瑟夫環 */ LinkList createLinkList(int n) {LNode *L = NULL;LNode *s;LNode *r = NULL;//尾指針if (n < 1) {return NULL;}//注釋這行的目的是為了去除頭結點,我們的數據節點從第一個開始//L = (LinkList)malloc(sizeof(LNode));//頭結點//r = L;int j = 1;int x;scanf_s("%d", &x);while (j<=n){s = (LinkList)malloc(sizeof(LNode));s->data = x;if (L == NULL) {//初始化第一個節點L = r = s;}else{r->next = s;r = s;}if (j == n) {break;}j++;scanf_s("%d", &x);}//指向第一個節點,形成閉環r->next = L;return L; } /* function:依次取出滿足條件的數據 */ void printData() {LNode *p =createLinkList(10);int j = 1;int k = 3;//約瑟夫環約定需要處理的節點標號while (p!=NULL){ //p = p->next;//獲取下一個節點地址if (j == (k -1)) {//達到約瑟夫環的條件需要移除節點的前驅節點LNode *q = p->next;//需要移除的節點p->next = q->next;p = p->next; //指針向前移動一個節點(從下一個節點開始)printf_s("%d \t", q->data);free(q);j == 1;}else{j++;}p = p->next;//獲取下一個節點地址} }void main() {printData(); }
以上為約瑟夫問題循環單鏈表的基本實現,幫助我們進一步熟悉循環單鏈表;我們還可以通過更高級的方式實現:遞歸,好吧,這就留給下次思考和實現了!
總結
以上是生活随笔為你收集整理的数据结构-循环单链表之约瑟夫问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 出现域名被劫持该如何处理
- 下一篇: 数据结构-循环单链表之魔术师发牌问题