2011-11-23 112 views
5

我想用鏈表實現堆棧。爲了實現我的棧的pop(),我讓調用者傳遞一個雙指針(指針指向)(最終)指向我堆棧的頂部(鏈表中的第一個條目)。解決雙引號問題

我這樣做的原因是因爲這樣調用者可以保持一個靜態指針到堆棧。

我的鏈表元素結構:

struct Element { 
int value; 
struct Element *next; 
}; 

pop()方法實現:

int pop (struct Element **stack) { 
    int popped_value = *stack->value; 
    *stack = *stack->next; 
    return popped_value; 
} 

我有問題試圖取消引用雙指針**堆棧。此代碼生成以下錯誤:

error: request for member ‘value’ in something not a structure 
error: request for member ‘next’ in something not a structure 

在我的腦海裏,無論是*重新建立了新>值或** stack.value應該努力找回popped_value,但我得到了相同的錯誤。

+0

只要使用好醇'堆棧 - >下一個' – Kapichu

回答

8

->比引用操作更高的優先級,所以這是喜歡嘗試取消引用stack->value因爲->首先得到完成,*秒完成。你需要使用括號:

int popped_value = (*stack)->value; 
*stack = (*stack)->next; 

或者,如wallyk在評論中建議,取消引用的說法得到一個單一指針和使用:

struct Element *sip = *stack; 
int popped_value = sip->value; 
*stack = sip->next; 
+0

非常有意義,感謝您的快速響應。 – CallMeRex

+1

要麼使用parens,要麼顯式使用中間值'struct Element * sip = * stack;'和'* stack = sip-> next;' – wallyk

6

->具有比非關聯較高operator precedence*)在這條線:

*stack->next 

你是在說:

*(stack->next) 

由於stack->next沒有意義,所以失敗。

你想:

(*stack)->next 

代替。