約瑟夫環迴圈連結串列的遞迴實現
阿新 • • 發佈:2019-01-04
約瑟夫(Joseph)問題的一種描述是:編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止。試設計一個程式求出出列順序。
此程式運用了迴圈連結串列和遞迴的方法來實現joseph環問題
#include<stdio.h> typedef struct Node { int data; int list; Node* next; }CirLinkedList,*LinkList; void InitCriLinkdeList(LinkList *CL) { *CL=new CirLinkedList; (*CL)->next=(*CL); } void CreatCirLinkedList(LinkList &CL,int n) { LinkList s,rear; rear=CL; printf("請輸入第1個人的密碼"); int dt; scanf("%d",&dt); CL->data=dt; CL->list=1; for(int i=0;i<n-1;i++) { s=new CirLinkedList; int k; printf("請輸入第%d個人的密碼",i+2); scanf("%d",&k); s->data=k; s->list=i+2; rear->next=s; rear=s; } rear->next=CL; } void DeleteCirLinkedList(LinkList CL,int n) { LinkList p=CL->next; LinkList k=CL; int t=n-2; if(CL->next!=CL) { while(t--) { k=k->next; p=p->next; } printf("淘汰的人的密碼是%d\n",p->data); printf("淘汰的人是%d號\n",p->list); k->next=p->next; DeleteCirLinkedList(p->next,p->data); } if(CL->next==CL) { printf("THE LUCKY ONE IS %d 號",CL->list); return ; } } int main() { LinkList CLink; int n,m; printf("請輸入玩約瑟夫遊戲人的個數n\n"); printf("請輸入第一次遊戲的值m\n"); while(scanf("%d,%d",&n,&m)==2) { InitCriLinkdeList(&CLink); CreatCirLinkedList(CLink, n); DeleteCirLinkedList(CLink,m); } }