gogogogogo
gogogogogo

Reputation: 119

Implementation of Queue using pointers : segmentation error by C language

everyone. I'm new to C. My code for queue by C language is not working, but I cannot understand where lays the cause. I got a segmentation fault error. What is the problem? Anyone, please help me. My english is bad, sorry.

I refered to this page.
I added the result of debug, I'm thinking about it...

thanks

#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.

Upvotes: 1

Views: 53

Answers (2)

conFusl
conFusl

Reputation: 939

To solve your segmentation fault after the output, you need to use Q->front when you check if the queue is empty:

int empty_q (){
    return (Q->front == NULL); 
}

Upvotes: 1

Jean-Marc Volle
Jean-Marc Volle

Reputation: 3323

You code does not compile but I suspect your error is here: Code crashes here when all chained items have been dequeed

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;
}

Proposed solution:

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

Upvotes: 1

Related Questions