用C语言 写了一个约瑟夫环 可是报错了 找了很久 没找出错误 求高手指出 源代码 以及执行结果如下。 20
#include<stdio.h>#include<stdlib.h>structcircularList{intnum;intdata;structcircularLi...
#include<stdio.h>#include<stdlib.h>struct circularList{ int num; int data; struct circularList *next;};struct circularList *creatList(){ struct circularList *head,*rear,*s; int a,b=0; head=(struct circularList *)malloc(sizeof(struct circularList)); head->data=1; //问题1:如何让head->data和num不显示在约瑟夫环之内?;
head->num=0; rear=head; printf("please input password(以0结束):"); scanf("%d",&a); while(a){ s=(struct circularList *)malloc(sizeof(struct circularList)); s->data=a; s->num=b+1; b=b+1; rear->next=s; rear=s; scanf("%d",&a); } rear->next=head; return head; } void josephRing(struct circularList *p){ struct circularList *t; int i,m,a,b; printf("please input m value(整数):"); scanf("%d",&m); for(i=0;i<m;i++){ p=p->next; } t=p->next; a=p->data; b=p->num; printf("%d ",b); free(p); p=t; while(p!=NULL){ for(i=0;i<a;i++){ p=p->next; } t=p->next; a=p->data; b=p->num; printf("%d ",b); free(p); p=t; }}void main(){ struct circularList *A; A=creatList(); josephRing(A); } //问题二 :怎么报错了??怎么回事 ??帮忙并修改一下 谢谢了( ^_^ ) 展开
head->num=0; rear=head; printf("please input password(以0结束):"); scanf("%d",&a); while(a){ s=(struct circularList *)malloc(sizeof(struct circularList)); s->data=a; s->num=b+1; b=b+1; rear->next=s; rear=s; scanf("%d",&a); } rear->next=head; return head; } void josephRing(struct circularList *p){ struct circularList *t; int i,m,a,b; printf("please input m value(整数):"); scanf("%d",&m); for(i=0;i<m;i++){ p=p->next; } t=p->next; a=p->data; b=p->num; printf("%d ",b); free(p); p=t; while(p!=NULL){ for(i=0;i<a;i++){ p=p->next; } t=p->next; a=p->data; b=p->num; printf("%d ",b); free(p); p=t; }}void main(){ struct circularList *A; A=creatList(); josephRing(A); } //问题二 :怎么报错了??怎么回事 ??帮忙并修改一下 谢谢了( ^_^ ) 展开
1个回答
展开全部
第一个问题无法回答你,因为没有理解你的意思
第二个问题错误原因是在josephRing函数中,出队节点被释放掉后,没有做前一节点的next指向后一节点,比如p1->p2->p3,释放p2时要做p1->p3处理,否则循环回来的话p1的next指针仍然指向p2,而p2已被释放掉,必然报错。
第二个问题错误原因是在josephRing函数中,出队节点被释放掉后,没有做前一节点的next指向后一节点,比如p1->p2->p3,释放p2时要做p1->p3处理,否则循环回来的话p1的next指针仍然指向p2,而p2已被释放掉,必然报错。
追问
t=p->next;
a=p->data;
b=p->num;
printf("%d ",b);
free(p);
p=t;
我把p->next赋给了t 然后释放了后再把t的值赋给p 这样不对么???
追答
那我问一下,被释放掉的p的上一个节点的next指向谁了?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询