1

私は C が初めてで、リンクされたリストを使用してスタックを実装しようとしています。現在スタックをセットアップしており、これまでのところすべて良好です。新しいノードをリストにプッシュしようとすると、問題が発生します。私は現在持っています

ではmain()push()次によって呼び出されます。

push(&(s.head), 'r');

機能pushは次のとおりです。

void push(StackNodePtr *topPtr, char value){
    printf("topPtr value %c", (*topPtr)->data); // - Is currently 'p'

    StackNodePtr sNP;
    sNP = malloc(Node_Size);
    sNP->data = value;                          // - Is currently 'r'
    sNP->nextPtr = *topPtr;

    printf("\nsNP value - %c", sNP->nextPtr->data);      // Prints p... cool
    topPtr = &sNP;      // Just assigned it???
    printf("\ntopPtr at end of push = %c", (*topPtr)->data);    // prints r... cool
    // WHY YOU NO REFERENCE sNP LATER!?!?
}

一方、メインに戻る:

    printf("\non the stack...%c", stackTop(s.head));  // prints 'p'

プッシュでは問題なく動作するようですが、ポイントしprintf()たノードと、代わりに出力されてtopPtrいた値(この場合は「p」) を呼び出します。topPtr私が行ったハンティングからわかる限り、見た目も感触も正しく、何を見逃したのかわかりません。

それは私がやった場所topPtr = &sNP;でしょうか?

正しい方向への「プッシュ」は、良いプッシュです...

4

5 に答える 5

2
topPtr = &sNP;      // Just assigned it???

この代入は関数の外では見えません。 topPtrつまり、そのコピーが作成され、関数に渡されます。したがって、別の値を割り当てても、コピーが変更されるだけです。元の引数は古いメモリ位置を指したままです。

そのように引数を変更する必要がある場合は、別のレベルの間接化が必要ですStackNodePtr**

StackNodePtrまた、それはtypedeffor a であると想定していStackNode*ます。私はそれについて正しいですか?typedefこのポインター型には正当な理由がありますか? 通常、それは物事を複雑にするだけです。typedefポインター型を 'ing するのは、それが真に不透明な型 (つまり、HANDLEWindows の場合)である場合のみにすることをお勧めします。

于 2012-05-13T18:00:07.240 に答える
1

そのはず

  *topPtr = sNP;

このようにして、呼び出し元がポインターを渡した元のヘッドは、新しいヘッドの次のものになり、正しく「上書き」され、呼び出し元は新しいヘッドへの正しいポインターを持ちます。

于 2012-05-13T18:00:15.433 に答える
0

関数 push がポインタ topPtr を変更しています。C は値渡しなので、head は値として渡され、渡されたコピーは push で変更されます。したがって、ポインター自体を変更するには、ポインターをポインターに渡す必要があります。また、関数 push() シグネチャは、ポインタからポインタへ渡すように修正する必要があります。最後に、コード スニペットに示すように、プッシュの topPtr 割り当てを修正する必要があります。

次の変更を行います。

push(&(s.head), 'r'); // pass pointer to pointer, assuming head is pointer, it should be fine

void push(StackNodePtr **topPtr, char value){  // make first argument pointer to pointer. 

StackNodePtr sNP;
sNP = malloc(Node_Size);
sNP->data = value;                       
sNP->nextPtr = *topPtr; 

*topPtr = &sNP;     <------*topPtr needs to be assigned. 
}
于 2012-05-13T17:59:31.657 に答える
0
topPtr = &sNP;      // Just assigned it???

いいえ、あなたはしませんでした。ポインターのローカル コピーに値を割り当てました。それ自体の値を変更し、topPtrそれは外に出ません。代わりに、それが指す場所に書き込む必要があります。

*topPtr = sNP;
于 2012-05-13T18:00:02.520 に答える
0

ここにバグがあるようです: topPtr = &sNP; // 割り当てただけ???

void を返すプッシュの代わりに。スタックの新しい先頭を返すように変更します。sNp を返します。

于 2012-05-13T18:02:18.467 に答える