C语言队列问题,求高手帮忙看下
这是一个只有一个尾指针指向最后一个节点的循环链式队列,我编写的一个入队列的函数,每一句我都注释得很清楚,麻烦帮忙看下哪个语句出错了,代码如下:structduilie{i...
这是一个只有一个尾指针指向最后一个节点的循环链式队列,我编写的一个入队列的函数,每一句我都注释得很清楚,麻烦帮忙看下哪个语句出错了,代码如下:
struct duilie
{
int num;
struct duilie *next;
};
void insert(struct duilie *rear,int a) //a为要入队的数值,rear是尾指针
{
struct duilie *p,*pp;
p=(struct duilie *)malloc(sizeof(struct duilie));
p->num=a;
pp=rear->next; //使PP指向队列的头结点,据我调试,是这语句出错了
rear->next=p; //使新节点接在最后一个节点的后面
rear=p; //尾指针往后移
rear->next=pp; //把队列的头结点和尾节点连接,构成循环队列
} 展开
struct duilie
{
int num;
struct duilie *next;
};
void insert(struct duilie *rear,int a) //a为要入队的数值,rear是尾指针
{
struct duilie *p,*pp;
p=(struct duilie *)malloc(sizeof(struct duilie));
p->num=a;
pp=rear->next; //使PP指向队列的头结点,据我调试,是这语句出错了
rear->next=p; //使新节点接在最后一个节点的后面
rear=p; //尾指针往后移
rear->next=pp; //把队列的头结点和尾节点连接,构成循环队列
} 展开
4个回答
展开全部
rear=p;应该是这句话的问题,你的参数truct duilie *rear,这么写可以改变rear指向内容的值,但不能改变rear指向的内容,应该使用指向指针的指针
void insert(struct duilie **rear,int a) //a为要入队的数值,rear是尾指针
{
struct duilie *p,*pp;
p=(struct duilie *)malloc(sizeof(struct duilie));
p->num=a;
pp=(*rear)->next; //使PP指向队列的头结点,据我调试,是这语句出错了
(*rear)->next=p; //使新节点接在最后一个节点的后面
*rear=p; //尾指针往后移
(*rear->next)=pp; //把队列的头结点和尾节点连接,构成循环队列
}
调用的时候把队尾指针的地址传过来
void insert(struct duilie **rear,int a) //a为要入队的数值,rear是尾指针
{
struct duilie *p,*pp;
p=(struct duilie *)malloc(sizeof(struct duilie));
p->num=a;
pp=(*rear)->next; //使PP指向队列的头结点,据我调试,是这语句出错了
(*rear)->next=p; //使新节点接在最后一个节点的后面
*rear=p; //尾指针往后移
(*rear->next)=pp; //把队列的头结点和尾节点连接,构成循环队列
}
调用的时候把队尾指针的地址传过来
追问
那按道理说这个创建队列的函数应该也是不行的?rear有错吗
void creat(struct duilie *rear)
{
struct duilie *p;
rear=(struct duilie *)malloc(sizeof(struct duilie));
p=rear;
rear->next=NULL;
printf("创建队列,请输入4个学生学号:\n");
for(int i=0;inext=(struct duilie *)malloc(sizeof(struct duilie));
rear=rear->next;
scanf("%d",&rear->num);
}
rear->next=p;
}
追答
对,这也是不行的,执行完了这个函数以后,函数外的rear还是原来的值,不是在函数中malloc出来的新的内存,应该使用指向指针的指印,或者把这个rear返回出去
展开全部
我还没有学到那里。星期天 ,我帮你吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
struct duilie * insert(struct duilie *rear,int a) //a为要入队的数值,rear是尾指针
{
struct duilie *p,*pp;
p=(struct duilie *)malloc(sizeof(struct duilie));
p->num=a;
pp=rear->next; //使PP指向队列的头结点,据我调试,是这语句出错了
rear->next=p; //使新节点接在最后一个节点的后面
p->next=pp; //把队列的头结点和尾节点连接,构成循环队列
return p;
}
这样调用 rear=insert(rear,a);
这个函数改变了 rear 但是,函数中改变的只是形参的值。用返回可以把值传回来。
不要被 它传入的是个指针给欺骗了。以为可以在函数改变值。
不想用返回,就得在传入函数时是 这个指针的地址才行,现在传入的是指针的内容。
{
struct duilie *p,*pp;
p=(struct duilie *)malloc(sizeof(struct duilie));
p->num=a;
pp=rear->next; //使PP指向队列的头结点,据我调试,是这语句出错了
rear->next=p; //使新节点接在最后一个节点的后面
p->next=pp; //把队列的头结点和尾节点连接,构成循环队列
return p;
}
这样调用 rear=insert(rear,a);
这个函数改变了 rear 但是,函数中改变的只是形参的值。用返回可以把值传回来。
不要被 它传入的是个指针给欺骗了。以为可以在函数改变值。
不想用返回,就得在传入函数时是 这个指针的地址才行,现在传入的是指针的内容。
追问
那按道理说这个创建队列的函数应该也是不行的?rear有错吗
void creat(struct duilie *rear)
{
struct duilie *p;
rear=(struct duilie *)malloc(sizeof(struct duilie));
p=rear;
rear->next=NULL;
printf("创建队列,请输入4个学生学号:\n");
for(int i=0;inext=(struct duilie *)malloc(sizeof(struct duilie));
rear=rear->next;
scanf("%d",&rear->num);
}
rear->next=p;
}
追答
没错,这个也是不行的,你看书上的事例程序,创建函数都是返回一个指针的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是编译器报的空指针赋值吧?主要原因:作者没有搞清楚C中的全局变量和局部变量的问题。
1。zts[35];point1[35];point2[35];x1[35]这四个数组在main()中有,在四个子函数中有,各是各的,互不干涉,所以main()中的这四个数组始终没有被赋值过,空指针指的就是这个吧。
2。应该把这四个数组的首地址作为四个read()的参数传过去,就可以实现:“在子函数中赋值,在main函数中使用” 的设计目的了。看程序,感觉作者就是这个目的吧。
3。 魔尊8 说的有一定道理,这四个read确实没有起到应有的作用。加上数组首地址做参数就可以了。或者把这四个数组做成全局变量也行啊。
4。作者有时间的话还是应该好好看看C语言的书啊。
1。zts[35];point1[35];point2[35];x1[35]这四个数组在main()中有,在四个子函数中有,各是各的,互不干涉,所以main()中的这四个数组始终没有被赋值过,空指针指的就是这个吧。
2。应该把这四个数组的首地址作为四个read()的参数传过去,就可以实现:“在子函数中赋值,在main函数中使用” 的设计目的了。看程序,感觉作者就是这个目的吧。
3。 魔尊8 说的有一定道理,这四个read确实没有起到应有的作用。加上数组首地址做参数就可以了。或者把这四个数组做成全局变量也行啊。
4。作者有时间的话还是应该好好看看C语言的书啊。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询