質問:私は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))'行から来ているようです。
デバッガでステップアップしてみましたか? "b.set()"で失敗する可能性がありますか? –
'if(〜isleaf(temp))'が奇妙に見えます。なぜあなたはブール値を反転するのですか?おそらく 'if(!isleaf(temp))'がここで欲しいものです。 -pedantic -Wall -Wextraをg ++に設定すると警告が表示されます。 xcodeのデフォルトのツールチェーンclangはおそらくあなたにも警告します。 – user4581301
@ user4581301私はそれが正しい構文であることを知らなかった。ありがとうございました! – arnavlohe15