2012-11-13 5 views
1

노드에 int를 트리에 삽입하려고하는 함수를 만들고 있습니다. 필자가 아는 한, 필자의 삽입 기능은 완벽하게 작동하지만 기능 외에서는 결코 일어나지 않았을 것입니다. 여기에 내 코드입니다 :함수 호출 외부에서 노드 매개 변수를 변경할 수 없습니다.

lcrs.h :

using namespace std; 
#include <cstdlib> 
#include <iostream> 

class node{ 
     public: 
     int data; 
     node *right; 
     node *below; 

     node() 
     { 
       right = NULL; 
       below = NULL; 
     } 
}; 

class lcrs{ 
     public: 
     node *root; 
     bool search(int, node*); 
     void print(node*); 
     void insert(int, node*); 
     int getHeight(node*); 

     lcrs() 
     { 
       root = NULL; 
     } 
}; 

그리고 lcrs.cpp :

using namespace std; 
#include "lcrs.h" 

bool lcrs::search(int x, node *b) 
{ 
     if(b == NULL) 
       return false; 
     else 
     { 
       if(b->data == x) 
         return true; 
       else 
       { 
         return search(x, b->right) || search(x, b->below); 
       } 
     } 
} 

void lcrs::print(node *z) 
{ 
     if(z->right == NULL && z->below == NULL) 
     { 
       cout << z->data << endl; 
     } 
     else if(z->below == NULL && z->right != NULL) 
     { 
       cout << z->data << ", "; 
       print(z->right); 
     } 
     } 
     else if(z->below != NULL && z->right == NULL) 
     { 
       cout << z->data << ", "; 
       print(z->below); 
     } 
     else 
     { 
       print(z->right); 
       print(z->below); 
     } 
} 

void lcrs::insert(int x, node *a) 
{ 
     if(a == NULL) 
     { 
       node *newnode; 
       newnode = new node; 
       newnode->data = x; 
       a = newnode; 
       cout << a->data << endl; 
     } 
     else if(a->data < x) 
     { 
       if(a->right != NULL) 
       { 
         insert(x, a->right); 
       } 
       else 
         a->right->data = x; 
     } 
     else 
     { 
       if(a->below != NULL) 
       { 
         insert(x, a->below); 
       } 
       else 
       { 
         a->below->data = x; 
       } 
     } 
} 

int lcrs::getHeight(node *h) 
{ 
     int height = 0; 
     if(h->below != NULL) 
     { 
       height ++; 
       return getHeight(h->below); 
     } 
     else 
       return height; 
} 

그리고 마지막으로 내 MAIN.CPP :

using namespace std; 
#include <iostream> 
#include <cstdlib> 
#include <cstring> 
#include "lcrs.h" 

int main() 
{ 
char *temp1; 
char *temp2; 
temp1 = new char; 
temp2 = new char; 

lcrs tree; 

do{ 
     cout << "LCRS> "; 
     cin >> temp1; 
     if(strcmp(temp1, "quit") == 0) 
     { 
       return 0; 
     } 
     if(strcmp(temp1, "insert") == 0) 
     {  cin >> temp2; 
       bool error; 
       for(int i=0; i<strlen(temp2)-1; i++) 
       { 
         if(!isdigit(temp2[i])) 
         { 
           cout << "Error!" << endl; 
           error = true; 
         } 
       } 
       if(!error) 
       { 
         tree.insert(atoi(temp2), tree.root); 
         if(tree.root == NULL) 
           cout << "Root is null." << endl; 
         else 
           cout << tree.root->data << endl; 
       } 
     } 
     else if(strcmp(temp1, "height") == 0) 
     { 
       if(tree.root == NULL) 
         cout << "-1" << endl; 
       else 
         cout << tree.getHeight(tree.root); 
     } 
     else if(strcmp(temp1, "preorder") == 0) 
     { 
       tree.print(tree.root); 
     } 
}while(strcmp(temp1, "quit") !=0); 

return 0; 
} 

그래서 내가 이해 내 기능이 실제로 변경되지 않습니다. 루트트리인데 이유를 이해하지 못합니다.

귀하의 도움에 감사드립니다.

+0

조회 패스는 참조로 전달하고 값으로 전달하십시오. 값으로 전달하고 있지만 참조로 전달되는 것처럼 보이기를 원합니다. – John3136

답변

2

귀하의 코드 :이 값에 의해 전달 되었기 때문 할당, 실제 인수를 업데이트하지 않습니다

void lcrs::insert(int x, node *a) 
{ 
     if(a == NULL) 
     { 
       node *newnode; 
       newnode = new node; 
       newnode->data = x; 
       a = newnode; 

↑.

   cout << a->data << endl; 
     } 
     else if(a->data < x) 
     { 
       if(a->right != NULL) 
       { 
         insert(x, a->right); 
       } 
       else 
         a->right->data = x; 
당신은 (보장있다) 알고 여기 ↑

것을 a->right는 nullpointer이다. nullpointer를 역 참조하는 경우 정의되지 않은 동작. 예를 들어 충돌.

 } 
     else 
     { 
       if(a->below != NULL) 
       { 
         insert(x, a->below); 
       } 
       else 
       { 
         a->below->data = x; 
       } 

↑ 여기는 a->below이 nullpointer라는 것을 알고 있습니다. nullpointer를 역 참조하는 경우 정의되지 않은 동작. 예를 들어 충돌. } } 일반적인 주석으로

, belowright 두 가지 은유를 혼합합니다. belowabove 또는 leftright으로 전화하는 것이 더 좋습니다. 후자의 선택은 매우 일반적입니다.

노드 포인터를 참조로 전달하는 대신 (업데이트되지 않은 문제를 수정하려면) 함수 결과로 반환하는 것이 좋습니다.

+0

감사합니다! 그것은 많은 도움이되었습니다. 또한 트리가 설정된 방식은 L과 비슷하므로 ** ** 및 ** 오른쪽 ** 아래는 시각적으로 의미가 있습니다. –

1

값을 사용하여 포인터를 전달합니다. 참조로 전달하려면 a 자체 대신 a에 대한 참조를 전달하는 void lcrs::insert(int x, node * & a)을 사용해야합니다. 무슨 일이 일어나는가는 노드에 대한 포인터가 함수 내에서 a으로 참조 된 로컬 변수에 복사된다는 것입니다. 그런 다음 함수는 복사본 (그리고 그것이 가리키는 메모리)을 자유롭게 변경할 수 있지만, 함수가 반환하면 호출자는 여전히 원본을보고 있으므로 복사본에 어떤 일이 발생했는지 전혀 알 수 없습니다.

참조로 전달되는 호출자와 호출 된 함수는 모두 복사본을 사용하고 다른 하나는 원본을 사용하는 대신 동일한 것을 사용합니다.

관련 문제