簡體   English   中英

使用指針實現隊列:C語言分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM