结构中的默认值
如果我使用条件 q->head==NULL && 我会收到运行时错误在空列表中入队时使用 q->tail==NULL 而不是 q->head==NULL,同时两个条件都足够。谁能告诉我错在哪里?我提供下面的完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
typedef struct node Node;
typedef Node* NODE;
struct node{
int data;
struct node* next;
};
typedef struct queue Queue;
typedef Queue* QUEUE;
struct queue{
NODE head;
NODE tail;
};
void initQueue(QUEUE q);
void enqueue(QUEUE q,int key);
void dequeue(QUEUE q);
void print(QUEUE q);
int main(int argc, char **argv){
QUEUE q;
initQueue(q);
//print(q);
dequeue(q);
enqueue(q,7);
enqueue(q,9);
print(q);
dequeue(q);
print(q);
return 0;
}
void initQueue(QUEUE q){
q=(QUEUE)malloc(sizeof(Queue)*1);
q->head=NULL;
q->tail=NULL;
}
void enqueue(QUEUE q,int key){
NODE temp;
temp=(NODE)malloc(sizeof(Node)*1);
temp->data=key;
temp->next=NULL;
if(q->head==NULL && q->tail==NULL){
q->head=temp;
q->tail=temp;
}
else{
q->tail->next=temp;
q->tail=temp;
}
}//end of enqueue()
void dequeue(QUEUE q){
NODE temp;
if(q->head==NULL){
printf("queue is empty");
}
else{
temp=q->head;
q->head=temp->next;
free(temp);
}
}
void print(QUEUE q){
NODE cur;
if(q->head==NULL){
printf("Queue is empty!\n");
}
else{
cur=q->head;
while(cur!=NULL){
printf("%d",cur->data);
cur=cur->next;
}//end of while
}//end of else
}//end of print
I am getting a runtime error if i use the condition q->head==NULL && q->tail==NULL instead of q->head==NULL for the enqueue in empty list, while both the conditions shall suffice. Can anyone tell me the fault? I am providing the entire code below:
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
typedef struct node Node;
typedef Node* NODE;
struct node{
int data;
struct node* next;
};
typedef struct queue Queue;
typedef Queue* QUEUE;
struct queue{
NODE head;
NODE tail;
};
void initQueue(QUEUE q);
void enqueue(QUEUE q,int key);
void dequeue(QUEUE q);
void print(QUEUE q);
int main(int argc, char **argv){
QUEUE q;
initQueue(q);
//print(q);
dequeue(q);
enqueue(q,7);
enqueue(q,9);
print(q);
dequeue(q);
print(q);
return 0;
}
void initQueue(QUEUE q){
q=(QUEUE)malloc(sizeof(Queue)*1);
q->head=NULL;
q->tail=NULL;
}
void enqueue(QUEUE q,int key){
NODE temp;
temp=(NODE)malloc(sizeof(Node)*1);
temp->data=key;
temp->next=NULL;
if(q->head==NULL && q->tail==NULL){
q->head=temp;
q->tail=temp;
}
else{
q->tail->next=temp;
q->tail=temp;
}
}//end of enqueue()
void dequeue(QUEUE q){
NODE temp;
if(q->head==NULL){
printf("queue is empty");
}
else{
temp=q->head;
q->head=temp->next;
free(temp);
}
}
void print(QUEUE q){
NODE cur;
if(q->head==NULL){
printf("Queue is empty!\n");
}
else{
cur=q->head;
while(cur!=NULL){
printf("%d",cur->data);
cur=cur->next;
}//end of while
}//end of else
}//end of print
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我想我知道问题是什么。在
出队
中,q->head 在某个时刻会变成NULL。 但是q->tail
仍然指向一些虚假地址!然后,在您的队列中,
q->head
为NULL
但q->tail
指向某个无效地址(旧尾部) 。因此,它不会输入
if
,而是会尝试q->tail->next=temp;
,这是 未定义 因为t->tail
被释放。I think I know what the problem is. In
dequeue
, q->head will at some point become NULL. Butq->tail
still points to some bogus address!Then, in your enqueue,
q->head
isNULL
butq->tail
points to some invalid address (the old tail).So it won't enter that
if
and instead it will tryq->tail->next=temp;
which is undefined sincet->tail
was freed.您应该始终在启用所有警告的情况下进行编译:
您可以忽略前两个警告(目前),但第三个警告会提示您的问题。
在
initQueue
中,您正在修改本地QUEUE
(这是一个指针)q
,而不是main
中的。更改
initQueue
的签名以采用QUEUE*
并在该函数中使用*q
或执行以下操作:You should always compile with all warnings enabled:
The first two warnings you can ignore (for now), but the third hints at your problem.
In
initQueue
you're modifying the localQUEUE
(which is a pointer)q
rather than the one inmain
.Either change the signature of
initQueue
to take aQUEUE*
and use*q
in that function or do the following: