指针链表
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴子出列的过程。 输入 8 3 输出: 3->6->1->5->2->8->4->7 #include
using namespace std; struct Node { int num; //猴子的编号 Node *next; //下一只猴子 }; int main() { int m,n,i,j,king; Node *head, *p,*q; cin>>m>>n; if(n==1) { king=m; } else //建立猴子围成的圆圈 { p=q=new Node; head = p; head->num=1; for(i=1,p->num=1; i
num=i+1; q->next=p; q=p; //q总是上一只 } q->next=head; //最后一只再指向第一只,成了一个圆圈 //下面开始数了 p=head; for(i=1; i
next; //围成圈的,可能再开始从第一只数,如果还未被淘汰的话 //找到了, q=p->next; //q将被删除 p->next=q->next; //q就这样被“架空了” p=q->next; //下一轮数数的新起点 cout<
num<<"->"; delete q; //将不在链表中的结点删除 } king=p->num; delete p; } cout<
using namespace std; struct node { int num; //猴子的编号 node *next; node *pre; }; int main(){ int m,s,n,k,i; node *head,*p,*q; bool flag; cin>>m>>s>>n>>k; head=new node; head->num=s; head->next=head; head->pre=head; q=head; for(i=1;i<=m-1;i++){ p=new node; if (i+s==m) p->num=m ;else p->num=(i+s)% m; p->pre=q; q->next=p; q=q->next; } p->next=head; head->pre=p; flag=true; q=head; while (m>1){ if (flag){ flag=false; i=1; while(i
next; i++; } cout<
num<<" "; p=q->pre; p->next=p->next->next; q->next->pre=p; delete q; } else{ flag=true; i=1; while (i
pre; i++; } cout<
num<<" "; q=p->next; q->pre=q->pre->pre; p->pre->next=q; delete p; } m--; } if (flag) cout<
num;else cout<
num; return 0; }