数据结构 约瑟夫环问题C++

来源:互联网 发布:淘宝阿迪达斯高仿店铺 编辑:程序博客网 时间:2024/06/05 02:06
需求分析
本程序是用VC编写,由于约瑟夫问题是n个人围坐在一圈,所以采用循环链表实现,又由于报数时可能循环到开始,所以采用不带头结点的循环链表结构。
题目要求的约瑟夫环操作:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
代码如下:
<span style="font-size:18px;">#include<iostream>using namespace std;class Node{public:int Index;int password;Node *next;};class Josephu{public:Josephu(int n,Node *L);private:Node *head;};Josephu::Josephu(int n,Node *L){head=L;Node* p=head;int i=1;for(i;i<n;i++){p->Index=i;cin>>p->password;p->next= new Node();p=p->next;}p->Index=i;cin>>p->password;p->next=head;}void func(int m,Node *head,int n){int i,j;Node *p=new Node();Node *q=head;while(n>1){i=m%n;if(i==0){i=m;}for(j=1;j<i;j++){p=q;q=q->next;}p->next=q->next;cout<<q->Index<<" ";m=q->password;free(q);q=p->next;n--;}cout<<q->Index<<endl;}int main(){int m,n;cin>>m>>n;Node *L=new Node();L->next=NULL;Josephu a(n,L);func(m,L,n);return 0;}</span>


0 0