上海学车哪家驾校好:大家帮我看看这个C语言小程序哪个地方出现了死循环

来源:百度文库 编辑:神马品牌网 时间:2024/04/28 05:11:22
#include<stdio.h>
#define NULL 0
struct hz { int bh;
int zg;
struct hz *p;};
struct hz *jllb(int m)
{struct hz *pb,*pf,*head;
int i;
for(i=1;i<=m;i++)
{pb=(struct hz*)malloc(sizeof(struct hz));
pb->bh=i;
pb->zg=1;
pb->p=NULL;
if(i==1)pf=head=pb;
else pf->p=pb;
pf=pb;}
return head;}

int hwzg(int m,int n)
{int i,sum=0;
struct hz *pf,*head,*pb;
head=jllb(m);
pb=head;
while(sum!=1)
{i=0;
while(i<=n)
{if(pb->zg==1) i++;
if(pb->p!=NULL) pb=pb->p;
else pb=head;}
pb->zg=0;
for(pf=head,sum=0;pf->p!=NULL;pf=pf->p)
sum+=pf->zg;
sum=sum+pf->zg;}
for(pf=head;pf->zg==0;pf=pf->p);
printf("sum=%d",sum);
return pf->bh;}

main()
{int m,n;
printf("请输入猴子个数m和报数n,用逗号间隔");
scanf("%d,%d",&m,&n);
printf("猴王的编号为:%d",hwzg(m,n));}
谢谢你了tonybird333,我已经找到问题了,改正后的如下:
#include<stdio.h>
#define NULL 0
struct hz { int bh;
int zg;
struct hz *p;};
struct hz *jllb(int m)
{struct hz *pb,*pf,*head;
int i;
for(i=1;i<=m;i++)
{pb=(struct hz*)malloc(sizeof(struct hz));
pb->bh=i;
pb->zg=1;
pb->p=NULL;
if(i==1)pf=head=pb;
else pf->p=pb;
pf=pb;}
return head;}

int hwzg(int m,int n)
{int i,sum=0;
struct hz *pf,*head,*pb;
head=jllb(m);
pb=head;
while(sum!=1)
{i=0;
while(i<n)
{if(pb->zg==1) i++;
if(pb->p!=NULL)pf=pb,pb=pb->p;
else pf=pb,pb=head;}
pf->zg=0;
for(pf=head,sum=0;pf->p!=NULL;pf=pf->p)
sum+=pf->zg;
sum=sum+pf->zg;}
for(pf=head;pf->zg==0;pf=pf->p);
printf("sum=%d",sum);
return pf->bh;}

main()
{int m,n;
printf("请输入猴子个数m和报数n,用逗号间隔");
scanf("%d,%d",&m,&n);
printf("猴王的编号为:%d",hwzg(m,n));}

死循环再 while(sum!=1)
猜想你的程序是解决绕圈报数问题,m个人每报n个数出来一个人,求最后出来的人。
你的程序使用链表,并且用一个标志位来表示人(或猴)在不在队列里。
有这样几个问题:
1。如果你用链表,没有必要用标志为。因为链表的优势是插入,删除方便,用了标志位,链表的结构没有变化,不如直接用一个大数组。
2。你每隔n个数设置标志为,但是在设置的时候,没有判断这个标志位是否已被设置了。
3。隔个个数计算错误,i=0, while(i<=n)一共跳了n+1个元素不是n个。

所以在很多情况下,sum永远不会是1,比如m=10,n=3,程序是每隔4个设标志,第一次是第五个,第二次是第十个,第三次呢还是第五个,。。sum值就不编了

解决方案:
1。不用标志为,计数到一个,就删除它。
2。使用标志为,但是在设置的时候,判断一下是否已设置