2011-11-23 10 views
5

リンクリストを使用してスタックを実装したいと思います。ダブルポインタの逆参照の問題

私のスタックにpop()を実装するために、呼び出し側はスタックポインタ(リンク先リストの最初のエントリ)を(最終的に)指すダブルポインタ(ポインタへのポインタ)を渡します。

私がこのようにしているのは、呼び出し元が静的ポインタをスタックに保持できるからです。

マイリンクリストの要素構造体:

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

ポップ()の実装:

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->値または** stack.valueがpopped_valueを取得するために動作するはずですが、私は同じエラーを取得する:このコードは、次のエラーが発生します。

+0

ちょうど良いolを使用してください - スタック - 次の – Kapichu

答えて

8

->は間接参照演算子よりも優先順位が高いので、それは最初に行われます->ので、間接参照stack->valueしようとしてようなものだ、と*は、第行わ。 wallykコメントで示唆されているように、単一のポインタを取得し、その使用する引数を間接参照し、

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

または::

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

は、スピーディーな応答のために感謝します。 – CallMeRex

+1

括弧を使うか、中間値 'struct element * sip = * stack;'と '* stack = sip-> next;を明示的に使用してください。 – wallyk

6

->が逆参照よりoperator precedenceが高い(*を)あなたは括弧を使用する必要がありますこの行に:

*stack->next 

あなたは言っている:

*(stack->next) 

stack->nextが失敗したのは意味がありません。

あなたが欲しい:代わりに

(*stack)->next