2017-09-28 12 views
0

私は(ADT)バイナリシードツリーの実装を行っています。私は、息子が持つ親の数を数える関数を実行しなければなりませんでした差は5未満です。プログラムが動作し、このFunctonだけが失敗します。HW3.exeの0xCFで処理されない例外:0xC0000005:アクセス違反の読み取り場所0x00000004

で 'return'(再帰的)にブレークポイントがあります。あなたが入力した場合、あなたのreturn声明で

int difference(BSTNode *root, comperFunc cmpFn, comperFunc lesserThenFive) 
{ 
    int count = 0; 
    if (root) 
    { 
     count = 0; 
     if (root->Left && root->Right) 
     { 
      //if root->Right > root->Left 
      if (cmpFn(root->Right->key, root->Left->key) == 1) 
      { 
       if (lesserThenFive(root->Right->key, root->Left->key)) 
        count = 1; 
      } 
      //if root->Right < root->Left 
      if (cmpFn(root->Right->key, root->Left->key) == -1) 
      { 
       if (lesserThenFive(root->Left->key, root->Right->key)) 
        count = 1;  
      } 
     } 
    } 
    return difference(root->Left, cmpFn, lesserThenFive) + difference(root- >Right, cmpFn, lesserThenFive) + count;//here is the break point 

}

+3

[mcve]を入力してください。 –

+1

'return difference(root-> Left、...': 'root'が' NULL'なら 'NULL'逆参照が発生します。 – BLUEPIXY

+0

@Lundinわかりませんでした:-) – JeremyP

答えて

1

あなたはNULLポインタデリファレンス、differencerootがnullであるだろう。

返品はifの中にある必要があり、elseの部分には魅力的な値を返す必要があります。

少し拡大します。あなたのアルゴリズムrecursivleyは、現在のrootの左右のノードでdifferenceを呼び出しますが、root->leftまたはroot->rightのうちの1つはNULLになります。あなたのreturnステートメントは、実際にdifferenceを呼び出して、左または右のメンバーがNULLになるように試みます。 NULL->left。現代のオペレーティングシステムでは、これが失敗します。

+0

参照が間違っている...間違っている –

+0

「逆参照」と言うとき、それはあなたのスペルミスではなく、「ルート」によって指し示されたメモリへのアクセスです。 Cで '* root'を実行すると、' root'を逆参照しています。 'root * left 'は'(* root).left'の短縮形です。 – JeremyP

関連する問題