2011-09-14 8 views
0

私は以前に質問された質問に関して特定のクエリを持っていました。StackTypeオブジェクトへのアクセスなしでスタックの先頭を変更します。

私はこの関数プロトタイプvoid StackPop(NodeType *Top)を与えられ、スタックオブジェクトのアクセスなしでスタックの先頭を修正するように指示されました。 StackPop関数はここではグローバル関数であり、Stackクラスのメンバ関数ではありません。ポップした後、TopはTop要素の新しい値を指すはずです。

解決策として、そのような場合にスタックの先頭をポップすることは、呼び出し中にスタックの先頭ノードのアドレスを関数に渡す場合にのみ可能です。例えば:StackPop(&address); は、スタック

NodeType* temp; 
temp = top; 
*top = (*top)->next; 
delete temp; 

これは質問に対する簡単な答えですまたは何か他のものの世話をする必要がある場合でのトップを変更するには?

+0

あなたの関数引数は 'Node'か' NodeType'ですか? –

+0

@Als:Editted。はい、それは 'NodeType'です。 – Cipher

答えて

0

はい、これは3点に注意して、質問への有効な単純な答えです:

  1. temp = toptemp = *topをお読みください。
  2. *topがNULLポインタを参照するのではなく、NULLである場合を正常に処理したい場合があります。
  3. この解決方法は、Node**を引数に取るため、[void StackPop(Node *Top)]と与えられたプロトタイプとは互換性がありません。

私が持っている他の唯一の注釈は、フリー関数ではなくメンバ関数であるように聞こえるということです。

+0

はい、クラスメンバ関数ではなくフリー関数ですが、上記のようにポップする機能に影響します(トップノードのアドレスを渡さなければならないという事実は無視されます)。 – Cipher

+0

@Cipher:いいえ、機能に違いはありません。おそらく間違いなく貧弱な設計。 – NPE

+0

StackPop(NodeType **ノード)に変更することなく、プロトタイプを変更しなくても可能ですか? – Cipher

関連する問題