-2

何らかの理由で、リストの途中からノードを削除する機能が、ユーザーが指定したノードではなく、最初のノードを削除しています。これが私の機能です:

template< class NODETYPE >
bool List< NODETYPE >::removeMiddle( NODETYPE &value, int i )
{
    ListNode <NODETYPE> * tempPtr = firstPtr;
    int counter=1;

    if ( isEmpty() )
        return false;
    if (i <= 0)
        return false;

    while (tempPtr != 0 && counter < i){
        counter++;
        if ( firstPtr == lastPtr )
            firstPtr = lastPtr = 0;
        else
            firstPtr = firstPtr->nextPtr;

        if (counter == i){
            value = tempPtr->data;  // data being removed
            delete tempPtr;
        }

    }

    return true;
    RecordCounter--;
}

誰かが私を正しい方向に向けるのを手伝ってくれますか?

4

3 に答える 3

1

私はそれが次の理由であると仮定しています:

 if ( firstPtr == lastPtr )
     firstPtr = lastPtr = 0;
 else
     firstPtr = firstPtr->nextPtr;

tempPtrではなく、確認して修正する必要がありfirstPtrます。

でチェックしないのでtempPtr、関数が呼び出します

if (counter == i){
   value = tempPtr->data;  // data being removed
   delete tempPtr;
}

しかし、tempPtr最初は に設定されfirstPtr、その後変更されることはありませんでした。

もちろん、少しデバッグすることでこれを簡単に見つけることができたので、コードを修正するつもりはありませんが、これは良い出発点です。

于 2012-07-30T01:43:43.710 に答える
0

これは、を割り当て、インクリメントするtempPtr = firstPtr代わりに、をインクリメントしているためです。tempPtrfirstPtr

次のコードを確認してください。

 while (tempPtr != 0 && counter < i)
    {
             counter++;
             if ( firstPtr == lastPtr)
                 firstPtr = lastPtr = 0;
             else
                 tempPtr = tempPtr->nextPtr; // Here tempPtr should be incremented not firstPtr

             if (counter == i)
             {
                 value = tempPtr->data;  // data being removed
                 delete tempPtr;
             }      
    } 
于 2012-07-31T09:45:44.923 に答える
0

何のためにあるのかわかりませんが、問題は、 の代わりにlastPtr変更して反復していることです。次に を削除しますが、それはまだリストの先頭を指しています。firstPtrtempPtrtempPtr

于 2012-07-30T01:45:32.083 に答える