2013-04-22 65 views
0

我使用雙向鏈表創建了一個堆棧結構,並且在彈出列表的最後一個元素時遇到了段錯誤。這裏是彈出方法和一些相關的全局變量:彈出堆棧的唯一成員

typedef struct node { 

    int value; 
    struct node *prev; 
    struct node *next; 

} node; 

node *head = NULL; 
node *tail = NULL; 
int stackSize = 0; 

int removeFromStack(){ 
    node *tempNode = head; 

    if(stackSize <= 0){ 
     emptyStackError(); 
    } 

    int val = head->value; 

    if(stackSize == 1){ 
     head = NULL; //Segfaults here 
     tail = NULL; 
    } 

    else{ 
     head = head->next; 
     head->prev = NULL; 
    } 

    free(tempNode); 
    stackSize--; 
    return val; 
} 

很顯然,我不應該只是將頭部和尾部設置爲空。我應該做些什麼呢?

+0

堆棧大小爲1的頭部和尾部應該等於堆疊上的單個物體 – brendosthoughts 2013-04-22 20:53:14

+0

@brendanmorrison:它是流行音樂之前的一個*,所以這看起來很好。 – Roddy 2013-04-22 20:54:53

+0

@brendanmorrison:將'head'和'tail'設置爲'NULL'的子句在'if'中,它在檢查'stackSize'之前會減少以指示最後一個對象已被刪除。該代碼將列表清空,而不是將其設置爲具有一個對象。 – 2013-04-22 20:55:04

回答

1

錯誤不可能是你說的。你只需要給一個指針賦值。我的猜測是它來自上面兩行。

前:

int val = head->value; 

請加:

assert(head != NULL && "Oops, the counter is messed up"); 

,並嘗試再次運行代碼。

如果斷言發生火災,請跟蹤stackSize的所有用法。如果不是,則不一定意味着指針不是隨機的,或者指向取消分配的空間。在此功能中,除head->value之外的所有內容都可以註釋。然後嘗試創建一個列表,按一個元素,然後嘗試撥打removeFromStack。然後嘗試按兩個元素,彈出一個並再次嘗試removeFromStack

我的猜測是你的計數器在另一個函數的某處被損壞。