[英]Implementation of Queue using pointers : segmentation error by C language
每個人。 我是 C 的新手。 我的 C 語言的隊列代碼不起作用,但我不明白原因所在。 我收到分段錯誤錯誤。 問題是什么? 任何人,請幫助我。 我的英語不好,對不起。
我參考了這個頁面。
我添加了調試的結果,我正在考慮它......
謝謝
#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.
您的代碼無法編譯,但我懷疑您的錯誤在這里: 當所有鏈接的項目都已出列時,代碼在此處崩潰
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;
}
建議的解決方案:
char dequeue(){
ELEM *e = Q->front;
if (e == NULL) return 0;
char r = e->v;
Q->front = Q->front->p;
free(e);
return r;
}
為了解決output之后的分段錯誤,在檢查隊列是否為空時需要使用Q->front
:
int empty_q (){
return (Q->front == NULL);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.