Reputation: 119
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;
}
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
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
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