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