2011-11-23 133 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 

代替。