2017-11-14 8 views
0

質問:私はexc_bad_access(プロセスコード11)エラーを受け取り続けます。これは悪いアルゴリズムや単純にコーディングエラーのためですか?誰でも私がそれを修正するのを助けることができる?

私のクラスの割り当ては、名前、残高、およびキーをノードに格納できるバイナリ検索ツリーを作成することです。キーを使用してノードを整理して検索する必要があります。このツリーは、挿入、インオーダートラバーサル、およびキーに基づいた検索(私はまだこの機能を構築していません)をサポートする必要があります。私はこれらの構築を容易にするためのいくつかの他の関数も含んでいます。重要な場合は、OSX High SierraでCLionを使用しています。さらに、ノード情報を入力するための最初のプロンプトでエラーが表示されますが、エラーは入力自体に関連していないようです。C++バイナリ検索ツリーの作成:EXC_BAD_ACCESSエラー。不正なアルゴリズムまたはコーディングエラー?

//Genghis Khan 
#include <iostream> 
#include <vector> 
using namespace std; 
class node 
{ 
public: 
    int key; 
    string name; 
    double balance; 
    node *leftptr; 
    node *rightptr; 
    friend class tree; 
}; 
class tree 
{ 
public: 
    node *root, *temp, *v; 

    //Constructor 
    tree() 
    { 
     root = NULL; 
     temp = root; 
    } 

    bool empty() 
    { 
     return(root == NULL); 
    } 


    bool isleaf(node *x) 
    { 
     return((x->leftptr == NULL) && (x->rightptr == NULL)); 
    } 

    void inorder(node *temp) 
    { 
     if(~isleaf(temp)) 
     { 
      inorder(temp->leftptr); 
      cout << "Name: " << temp->name << " " << "Balance: " << 
    temp->balance << " " << "Key: " << temp->key; 
      inorder(temp->rightptr); 
     } 
    } 

    node* createnode() 
    { 
     v = new node; 
     cout << "Enter name (string): " << endl; 
     getline(cin, v->name); 
     cout << "Enter key (integer): " << endl; 
     cin >> v->key; 
     cout << "Enter balance (double): " << endl; 
     cin >> v->balance; 
     return(v); 
    } 

    void set() 
    { 
     temp = root; 
    } 

    void insert(node *v) 
    { 
     while(~isleaf(temp)) 
     { 
      if((v->key < temp->key)) 
      { 
       temp = temp->leftptr; 
       insert(v); 
      } 
      else if(v->key > temp->key) 
      { 
       temp = temp->rightptr; 
       insert(v); 
      } 
     } 
    temp->key = v->key; 
    temp->balance = v->balance; 
    temp->name = v->name; 
    } 

}; 

int main() 
{ 
    int n; 
    cout << "Enter number of people: "; 
    cin >> n; 

    //Creating instance of tree, inserting all data into tree 
    tree b; 
    for(int i = 0; i < n; i++) 
    { 
     b.set(); 
     node *a = b.createnode(); 
     b.insert(a); 
    } 

    //inorder part 
    b.set(); 
    b.inorder(b.temp); 

} 

関数(擬似コード)である。入力されるノードの数の

1. function isleaf(x): return(x's left pointer and x's right pointer are both NULL) 

2. function set(): set temp to root //temp will be reset every time an insertion, traversal, or search occurs 

3. function createnode(): 

    v is a new node 

    get all the fields for v 

    return v 

4. function insert(v) 

    while(not isleaf(temp)): 
    -if(v's key < temp's key) 
    temp = temp's left pointer (to the lower value child node)  
    insert(node *v) 

    -if(v's key > temp's key) 
    temp = temp's right pointer (to the higher value child node) 
    insert(node *v) 
    end while 
    duplicate v's data to temp, now that temp is a leaf 

5. function inorder(temp): 
    if(not isleaf(temp): 
    inorder(temp's left pointer) 
    output all info in temp node 
    inorder(temp's right pointer) 

メインアルゴリズム


1.
2ノード* A = createnodeを設定します
3. insert(a)

更新

エラーが 'if((v-> key < temp-> key))'行から来ているようです。

+0

デバッガでステップアップしてみましたか? "b.set()"で失敗する可能性がありますか? –

+0

'if(〜isleaf(temp))'が奇妙に見えます。なぜあなたはブール値を反転するのですか?おそらく 'if(!isleaf(temp))'がここで欲しいものです。 -pedantic -Wall -Wextraをg ++に設定すると警告が表示されます。 xcodeのデフォルトのツールチェーンclangはおそらくあなたにも警告します。 – user4581301

+0

@ user4581301私はそれが正しい構文であることを知らなかった。ありがとうございました! – arnavlohe15

答えて

0

EXC_BAD_ACCESSは、無効なメモリにアクセスしようとしていることを意味します。簡単な要約では、関数isleafは、xがnullかどうかをチェックしません。

他にもエラーがある場合は、自分でデバッグして見つけることができます。

+0

回答は、問題を解決するためにいくつかの試みを行う必要があります。 – user4581301

+0

@iamnoten私はこれまでに、xがヌルであるかどうかをチェックして、その左右のポインタをチェックするようあなたの提案を試みましたが、それは違いを生じさせていませんでした。 – arnavlohe15

+0

@ arnavlohe15をinsert関数で使用するには、最初にツリーが空であるかどうかをチェックします。空であれば、ノードをrootに割り当てます。空でない場合は、whileループを実行します。 – iamnoten

関連する問題