【发布时间】:2011-08-10 10:07:53
【问题描述】:
如果我对空列表中的队列使用条件 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
【问题讨论】:
-
我还建议您接受其他问题的一些答案...
-
考虑删除部分或全部
typedefs。使用queue作为结构标记,Queue作为struct queue的别名,和QUEUE作为pointer to struct queue的别名只是令人困惑。结构的类型定义是常见的做法(但您可以使用相同的标识符:typedef struct queue queue;),但指针类型的类型定义具有潜在危险。显式使用指针语法会迫使您意识到您正在使用指针。例如,我会写void initQueue(struct queue *q);。
标签: c queue conditional-statements runtime-error