Todo el mundo. Soy nuevo en C. Mi código para la cola por lenguaje C no funciona, pero no puedo entender dónde está la causa. Recibí un error de segmentación. ¿Cuál es el problema? Cualquiera, por favor ayúdame. Mi inglés es malo, lo siento.

Me referí a esta página.
Agregué el resultado de la depuración, estoy pensando en eso ...

Gracias

#include <stdio.h>
#include <stdlib.h>

typedef struct element {
    char v;
    struct element *p;
} ELEM;

typedef struct {
    ELEM *front;
    ELEM *rear;
} queue;

queue *Q;
Q = (queue *)malloc(sizeof(queue));
Q->front = Q->rear = NULL;

int empty_q (){
    return (Q == NULL);
}

void enqueue(char x){
    ELEM *e;
    e = (ELEM *)malloc(sizeof(ELEM));
    if (e != NULL) {
        e->v = x;
        if (Q->front == NULL)
            Q->front = e;
        if (Q->rear != NULL)
            Q->rear->p = e;
        Q->rear = e;
        Q->rear->p = NULL;
    }
    return;
}

char dequeue(){
    char r = 0;
    if(!empty_q()){
        ELEM *e;
        e = Q->front;
        r = e->v;
        Q->front = Q->front->p;
        free(e);
    }
    return r;
}

int main(void){
    enqueue('a');
    enqueue('b');
    enqueue('c');
    while (!empty_q()) {
        printf("%c \n", dequeue());
    }
    free(Q);
    return 0;
}

Error

aa.c:20:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
Q = (queue *)malloc(sizeof(queue));
^
aa.c:20:1: error: redefinition of 'Q' with a different type: 'int' vs 'queue *'
aa.c:15:8: note: previous definition is here
queue *Q;
       ^
aa.c:21:1: error: unknown type name 'Q'
Q->front = Q->rear = NULL;
^
aa.c:21:2: error: expected identifier or '('
Q->front = Q->rear = NULL;
 ^
1 warning and 3 errors generated.
c
1
gogogogogo 7 may. 2020 a las 18:41

2 respuestas

La mejor respuesta

Su código no se compila, pero sospecho que su error está aquí: el código se bloquea aquí cuando se han eliminado todos los elementos encadenados

char dequeue(){
    char r = 0;
    if(!empty_q()){
        ELEM *e;
        e = Q->front; // e is null after a,b,c have been removed
        r = e->v; // crash
        Q->front = Q->front->p;
        free(e);
    }
    return r;
}

Solución propuesta:

char dequeue(){
    ELEM *e =  Q->front;
    if (e == NULL) return 0;
    char r = e->v;
    Q->front = Q->front->p;
    free(e);
    return r;
}
1
Jean-Marc Volle 7 may. 2020 a las 16:16

Para resolver su falla de segmentación después de la salida, debe usar Q->front cuando verifica si la cola está vacía:

int empty_q (){
    return (Q->front == NULL); 
}
1
conFusl 7 may. 2020 a las 16:30