约瑟夫环,求改错,请注明出错位置和原因
#include <stdio.h>#include <malloc.h>#define LEN sizeof(struct josephus)struct Josephus{ int num; struct Josephus * point;};void main(){ struct josephus *head,*p1,*p2; int n,m,i=1; printf("输入人数!\n"); scanf("%d",&n); p1=p2=(struct josephus *)malloc(LEN); for(i=1;i<=n;i++) { if(i==1) head=p1; else p2=p1; p2->num=i; p1=(struct josephus *)malloc(LEN); p2->point=p1; } p2->point=head; printf("输入退出号码!\n"); scanf("%d",&m); p1=p2=head; p1=p1->point; while(p1!=p2) { i++; p1=p1->point; p2=p2->point; if(i==m) { i=0; p2=p1; } }printf("最后剩下的人为第 %d 个人",p1->num);}#include<stdio.h>#include<stdlib.h> typedef struct node{ int value; struct node *next; }NODE;NODE *createlink(int n){ NODE *head=NULL,*p=NULL,*q=NULL; int i=1; head=p=(struct node*)malloc(sizeof(struct node)); p->value=i; for(i=2;i<=n;i++){ q=(struct node*)malloc(sizeof(struct node)); if(q==0) return 0; p->next=q; p=q; p->value=i; } p->next=head; return head; }void jose(NODE *p,int n,int m){ int i,j,g=0; NODE *q=NULL; for(i=1;i<=n;i++){ for(j=1;j<m;j++){ p=p->next;} q=p->next; p->next=q->next; if(g%5==0) {g++;printf("\n");} else g++; printf("%3d:%3dout ",i,q->value-1); free(q); } printf("\n"); p->next=NULL;}int main( ){ int m=0; int n=0; scanf("%d",&m); scanf("%d",&n); NODE *head=NULL; head=createlink(n); jose(head,n,m); return 0;}
[解决办法]
while(p1!=p2)
{
i++;
p1=p1->point;
p2=p2->point;
if(i==m)
{
i=0;
p2=p1;
}
}
这样写while()循环好像只执行到第一次i==m时就结束了
i=2;
while(p1!=p2)
{
i++;
p1=p1->point;
p2=p2->point;
if(i==m)
{
t++;
printf("第%d个出局的为第 %d 个人\n",t,p1->num);
i=1;
p2->point=p1->point;
p1=p1->point;
}
}
printf("最后剩下的是第%d个人\n",p1->num);
这样写好像可以