질문 : exc_bad_access (프로세스 코드 11) 오류가 계속 나타납니다. 이것은 잘못된 알고리즘 또는 단순히 코딩 오류로 인한 것입니까? 아무도 내가 고칠 수 있도록 도와 줄 수 있습니까?
내 수업 과제는 노드에 이름, 잔액 및 키를 저장할 수있는 이진 검색 트리를 만드는 것입니다. 키를 사용하여 노드를 구성하고 검색해야합니다. 이 트리는 삽입, inorder traversal 및 키를 기반으로 검색을 지원해야합니다 (아직이 기능을 구축하지 않았습니다). 또한 이러한 기능을 구현하기위한 몇 가지 다른 기능을 포함 시켰습니다. 문제가된다면 OSX High Sierra에서 CLion을 사용하고 있습니다. 또한 노드 정보를 입력하라는 첫 번째 프롬프트에서 오류가 발생합니다. 오류는 입력 자체와 관련이없는 것처럼 보입니다. C++ 바이너리 검색 트리 만들기 : EXC_BAD_ACCESS 오류. 잘못된 알고리즘 또는 코딩 오류?
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)
주요 알고리즘
노드의 번호를 입력 할 :
//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.
2 노드 * A = createnode 세트
3. 삽입 (a)
업데이트
오류가 'if ((v-> key < temp-> key))'행에서 오는 것 같습니다.
디버거를 사용하여 스테핑을 시도 했습니까? "b.set()"에서 실패 할 수 있습니까? –
'if (~ isleaf (temp))'가 이상하게 보입니다. 왜 당신은 부울을 뒤집을 수 있겠습니까? 아마도'if (! isleaf (temp)) '가 당신이 원하는 것일 수도 있습니다. -pedantic -Wall -Wextra와 g ++는 경고 메시지를 표시합니다. xcode의 기본 도구 체인 인 clang은 아마도 여러분에게도 경고 할 것입니다. – user4581301
@ user4581301 나는 그것이 적절한 구문인지 몰랐다. 고맙습니다! – arnavlohe15