2013-02-18 11 views
0

최근에 나는 C++, 즉 클래스와 포인터로 놀기 시작했습니다. 나는 비슷한 질문을 둘러 보았지만 아무것도 도움이되지 못했다.C++ 바이너리 검색 트리

일부 정보를 문자열 형식 (글자, char *)으로 유지하는 이진 검색 트리 클래스가 있지만 트리에 새 노드를 추가 한 후 정크를 반환하므로 정보를 다시 가져올 수 없습니다.

class Node 
{ 
    Node *lNode; 
    Node *rNode; 
    char *name; 
    public: 
     void setName(char *n) { name = n; } 
     char *getName() { return name; } 
} 

class Tree 
{ 
    Node *root; 
    Node *addNode(Node *, Node *); 
    public: 
     Tree() { root = NULL }; 
     int addNewNode(Node *); 
     void print(); 
}; 

int Tree::addNewNode(Node *n) 
{ 
    root = addNode(root, n); 
    cout << root->getName() << endl; // this returns the name correctly 
} 

Node *Tree::addNode(Node *subtree, Node *node) 
{ 
    if(subtree== NULL) 
    { 
     subtree = node; 
    } 
    else if(node->getName() <= subtree->getLeft()) 
    { 
     subtree->setLeft(addNode(subtree->getLeft(), node)); 
    } 
    else 
    { 
     subtree->setRight(addNode(subtree->getRight(), node)); 
    } 

    return subtree; 
} 

void Tree::print() 
{ 
    cout << root->getName() << endl; // this does not! 
} 

그리고이 방법을 호출 할 곳은 다음과 같습니다 :

Tree *myTree = new Tree(); 

Node *n = new Node(); 
n->setName(name); 
myTree->addNewNode(n); 

트리 변수가 외부 컨테이너 클래스의 private 멤버 속성입니다, 그리고 여기에

내 코드는 모습입니다 실제로 그 클래스 외부에서 생성되어 생성자로 전달됩니다. addNewNode 메소드를 호출하면 노드가 트리에 추가되지만 루트에 저장된 노드의 이름을 출력하려고 할 때 정크가 발생합니다. 어딘가에 헤이 와이어 포인터가있는 것 같아요.하지만 내 인생에서 찾을 수는 없어요.

도움을 주시면 감사하겠습니다.

+2

'std :: map' 또는'std :: set'을 사용하지 않는 이유는 무엇입니까? –

+0

매개 변수의 이름을 멤버와 동일한 이름으로 지정하지 마십시오. 그런 식으로 실수를 할거야 ... –

+0

그건 내 바보 같았 어. '하위 트리'로 변경되었지만 여전히 동일합니다. – straphe

답변

0

문자열 포인터 이름을 setName으로 전달하고 포인터를 name에 복사하는 것으로 추측합니다 (문자열을 다시 할당하고 저장하는 것과 반대). 나중에 원래 개체가 사라지고 개체 name이 쓰레기를 가리키고 있습니다. name 대신 std :: string을 사용하거나 name = new char[ strlen(n) + 1 ] 및 strcpy/memcpy로 자신의 메모리를 생성하십시오. 그 경로를 이동하면 객체 파괴시 delete [] name을 잊지 마십시오.

+0

그리고 그것을 고쳤습니다. 고맙습니다. 나는 여전히 일부 변수의 범위를 내 머리 속에 감쌀 필요가있다. 매우 감사합니다. :) – straphe

0

root가 null 인 경우 노드가 아닌 도시로 설정합니다. 네 문제가있어.

관련 문제