资源描述:
《约涩夫问题多种解法》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、约涩夫问题多种解法代码1:#includeusingnamespacestd;typedefstructNode{intdata;structNode*next;}Lnode,*LinkList;LinkListCreat(intnum){LinkListL;Lnode*s,*r,*head;inti=1;L=r=NULL;while(1){s=newLnode;s->data=i;i++;if(L==NULL){L=s;head=L;}elser->next=s;r=s;if(i==num+1)break;}r->next=he
2、ad;returnL;}intout(LinkListL,intnum,intstep){Lnode*p,*s,*n;p=L;for(inti=1;i<=num;i++){intcount=1;//用count定位到第m个人,循环后,p1指向这个人,p2指向这个人的上一个人while(count++<=step){s=p;p=p->next;}cout<data<<"";//输出当前人的编号n=p;//p指向当前这个人s->next=p->next;//把当前的人前的人和当前的人后的人连上.p=p->next;//下次从当前的人的下一个人开始
3、数deleten;//把这个人删除(就是释放这块内存)}/*inti=0;while(1){for(intj=0;jnext;s=p;p=p->next;s=p->next;cout<data<<"";i++;if(i==num)break;}*/return0;}voidget(LinkListL,intstep){Lnode*p,*s;p=L;p=p->next;p=s;p=p->next;s->next=p->next;cout<data;deletep;}intmain(){LinkListL;i
4、ntnum,step;cin>>num>>step;L=Creat(num);out(L,num,step);//get(L,step);return0;}代码2:(很好)#include#includestructstu{intnum;structstu*next;};intm,n;structstu*p,*q,*s;structstu*create(){structstu*head,*s1,*r;inti;head=NULL;for(i=1;i<=n;i++){s1=(structstu*)malloc(si
5、zeof(structstu));s1->num=i;if(head==NULL)head=s1;elser->next=s1;r=s1;}if(r)r->next=head;returnhead;}structstu*get_index(structstu*head,intk){intj=1;if(k<1){printf("输入错误");returnNULL;}s=head;while(s&&jnext;j++;}returns;}voidf1(structstu*head,structstu*h){intx,i;x=m/2;
6、p=h;i=1;printf("依次出列的人的编号为:");while(p->next!=p){q=p->next;for(i=1;inext;q=p->next;}p->next=q->next;printf("%d",q->num);free(q);p=p->next;}printf("最后剩下的人的编号为%d",p->num);}voidf2(structstu*head,structstu*h){inti,x;x=m/2;i=1;p=h;printf("依次出列的人的编号为:");do{for(i=1;i<=x;
7、i++){q=p->next;p=q->next;}q->next=p->next;printf("%d",p->num);free(p);p=q->next;}while(q->next!=q);printf("最后剩下的人的编号为%d",q->num);}voidmain(){intk;structstu*head,*h;printf("请输入总人数:");scanf("%d",&n);printf("请输入退出圈子的人的编号:");scanf("%d",&m);printf("请输入开始报数的人的编号:");scanf("%d",&k)
8、;head=create();h=get_index(head,k);if(m%2==0)f1(head,h