Значения по умолчанию в структуре - PullRequest
0 голосов
/ 10 августа 2011

Я получаю ошибку времени выполнения, если я использую условие 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

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Вы должны всегда компилировать со всеми включенными предупреждениями:

$ 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;
}
2 голосов
/ 10 августа 2011

Мне кажется, я знаю, в чем проблема.В dequeue 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->head равен NULL, но q->tail указывает на какой-то неверный адрес (старый хвост).

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

Таким образом, он не введет этот if, а вместо этого попытается q->tail->next=temp;, что составляет undefined , поскольку t->tail был освобожден.

...