2017-11-14 4 views
0

질문 : 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))'행에서 오는 것 같습니다.

+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가 null인지 확인하고 왼쪽 포인터와 오른쪽 포인터를 확인하기 위해 제안을 시도했지만 차이가없는 것 같습니다. – arnavlohe15

+0

@ arnavlohe15 삽입 기능에서, 먼저 트리가 비어 있는지 확인하십시오. 비어 있으면 노드를 root에 할당하십시오. 비어 있지 않으면 while 루프를 건너 뜁니다. – iamnoten

관련 문제