2016-09-09 5 views
-4

次のコードを使用していますが、次のような状況で修正プログラムを書き込もうとしています。パラメータに渡された数値がリストに存在しないため、データを使用して前のポインタを取得するC++のリンクリスト

この関数はべきである:は、それがそのデータ 同じであるリストと、最初に見つかったノードを横断するために使用する値 を受け入れ、それが一致するノードの前ListNodeへのポインタを戻します。

//return a pointer to the ListNode before the matching node data 
template < typename NODETYPE > 
    ListNode <NODETYPE> * List <NODETYPE>::prevPointerUsingData(NODETYPE &data) { 
    ListNode <NODETYPE> *previousPtr = NULL; 
    ListNode <NODETYPE> *currentPtr = firstPtr; 

    //first node cannot have a previous 
    if(data == currentPtr->data) { 
     cout << "canot have a previous node" << endl; 
     return 0; 
    }else { 
     //traverse until you've met the previous' node's data 
     while (currentPtr->nextPtr != NULL) { 
      if(currentPtr->nextPtr->data == data){ 
       //previous is assigned the current node 
       previousPtr = currentPtr; 
       currentPtr = currentPtr->nextPtr; 
       cout << previousPtr->data << " <--previousData" << endl; 
       return previousPtr; 
      }else { 
       currentPtr = currentPtr->nextPtr; 
      } 
     }if(currentPtr->nextPtr == NULL && currentPtr->nextPtr->data != data) { 
      cout << "no such node" << endl; 
      return 0; 
     } 


    } 


} 

私は私のリストにないもののように数(データ)を入力すると、それがクラッシュします。どこかでロジックが間違っていますか?

EDIT: 私は、リストが空の場合、それはリターン0の場合、私はこのコードを取得し、上記のいずれかにそれを適用して参照するにはIFチェックを追加するのイム思考が、働くこのコードを書きました上記のものがノードからのデータを使用し、以下ではポインタを使用する点を除いて、同じことを行うためです。

この関数は:は、リスト内のノードの位置を と指定してintを受け取り、そのノードの前のListNodeへのポインタを返します。

//return pointer to the ListNode before that node 
template < typename NODETYPE > 
    ListNode <NODETYPE> * List <NODETYPE> ::prevPointerUsingPosition(int position) { 
    ListNode <NODETYPE> * previousPtr = NULL; 
    ListNode <NODETYPE> * currentPtr = firstPtr; 

    if(position < 1) { 
     return 0; 
    }else if(position > sizeOfList()) { 
     return 0; 
    }else { 
     for(int i = 1; i < position-1; i++) { 
      currentPtr = currentPtr->nextPtr; 
     } 
     previousPtr = currentPtr; 
     currentPtr = currentPtr->nextPtr; 
     cout << previousPtr->data << " <--previousData" << endl; 
     return previousPtr; 
    } 
    } 
+0

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+1

クラッシュする行はありますか?デバッガはあなたに何を伝えますか? –

+0

コードに2つの目立つ冗長性があります。 1つは 'else'で、これは前のブロックが' return'で終わるので不要です。もう一つは 'if'の中の' currentPtr-> nextPtr == NULL'のテストです - あなたはそれが以前の 'while'ループが終了する唯一の条件であることを既に知っています。これらの冗長性は、コードを理解しにくくします。 –

答えて

0

変更

if(currentPtr->nextPtr == NULL && currentPtr->nextPtr->data != data) 

if(currentPtr->nextPtr != NULL && currentPtr->nextPtr->data != data) 

Plusには、まずif声明の中で、それを逆参照する前にnull以外のためfirstPtrをチェックする必要があります。

+0

私はprevPointerUsingPositionという別の関数を作成しましたが、それは動作しますが、私は同じコンセプトを適用しようとしていましたが、完全には機能しませんでした。上記のコードを編集します – masterplox

3

あなたはcurrentPtr->nextPtrNULLであれば、あなたはcurrentPtr->nextPtr->data != data状態でこのNULLポインタを参照解除されている

if(currentPtr->nextPtr == NULL && currentPtr->nextPtr->data != data) 

、以下の声明の中で間違いを行っています。

関連する問題