结构中的默认值

发布于 2024-11-29 08:31:15 字数 1691 浏览 0 评论 0原文

如果我使用条件 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

醉生梦死 2024-12-06 08:31:15

我想我知道问题是什么。在出队中,q->head 在某个时刻会变成NULL。 但是q->tail仍然指向一些虚假地址

void dequeue(QUEUE q){
    NODE temp;
    if(q->head==NULL){
        printf("queue is empty");
    }
    else{
        temp=q->head;
        q->head=temp->next;
        free(temp);    
    }
}

然后,在您的队列中,q->headNULLq->tail 指向某个无效地址(旧尾部) 。

if(q->head==NULL && q->tail==NULL)

因此,它不会输入 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. But q->tail still points to some bogus address!

void dequeue(QUEUE q){
    NODE temp;
    if(q->head==NULL){
        printf("queue is empty");
    }
    else{
        temp=q->head;
        q->head=temp->next;
        free(temp);    
    }
}

Then, in your enqueue, q->head is NULL but q->tail points to some invalid address (the old tail).

if(q->head==NULL && q->tail==NULL)

So it won't enter that if and instead it will try q->tail->next=temp; which is undefined since t->tail was freed.

青芜 2024-12-06 08:31:15

您应该始终在启用所有警告的情况下进行编译:

$ gcc -Wall -Wextra -W -pedantic -std=c99 q.c
q.c: In function ‘main’:
q.c:25:14: warning: unused parameter ‘argc’
q.c:25:27: warning: unused parameter ‘argv’
q.c:27:14: warning: ‘q’ is used uninitialized in this function

您可以忽略前两个警告(目前),但第三个警告会提示您的问题。

int main(int argc, char **argv){
    QUEUE q;
    initQueue(q);

[snip]

void initQueue(QUEUE q){
    q=(QUEUE)malloc(sizeof(Queue)*1);

initQueue 中,您正在修改本地 QUEUE(这是一个指针)q,而不是 main 中的。

更改 initQueue 的签名以采用 QUEUE* 并在该函数中使用 *q 或执行以下操作:

int main(int argc, char **argv){
    QUEUE q;
    q = initQueue();

[snip]

QUEUE initQueue(){
    QUEUE q=(QUEUE)malloc(sizeof(Queue)*1);
    q->head = q->tail = NULL;
    return q;
}

You should always compile with all warnings enabled:

$ gcc -Wall -Wextra -W -pedantic -std=c99 q.c
q.c: In function ‘main’:
q.c:25:14: warning: unused parameter ‘argc’
q.c:25:27: warning: unused parameter ‘argv’
q.c:27:14: warning: ‘q’ is used uninitialized in this function

The first two warnings you can ignore (for now), but the third hints at your problem.

int main(int argc, char **argv){
    QUEUE q;
    initQueue(q);

[snip]

void initQueue(QUEUE q){
    q=(QUEUE)malloc(sizeof(Queue)*1);

In initQueue you're modifying the local QUEUE (which is a pointer) q rather than the one in main.

Either change the signature of initQueue to take a QUEUE* and use *q in that function or do the following:

int main(int argc, char **argv){
    QUEUE q;
    q = initQueue();

[snip]

QUEUE initQueue(){
    QUEUE q=(QUEUE)malloc(sizeof(Queue)*1);
    q->head = q->tail = NULL;
    return q;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文