트리 구조를 작성하고 트리 내의 노드를 찾기위한 기본 검색 기능을 만들었습니다. 트리 자체는 센티널 노드를 사용하여 모든 끝 (루트의 부모, 잎의 자식)을 표시하고 검색은 노드를 통해 반복하여 일치 항목을 찾거나 감시 노드에 도달 할 때까지 반복합니다. 트리의 인스턴스에서 검색 기능을 호출하면 검색 기능이 제대로 작동하지만 트리가 다른 클래스의 데이터 멤버 일 때 막히게됩니다. 다음 코드에서 "t.search (1)"은 작동하지만 "embedded_tree.t.search (1)"은 무한 루프에서 멈 춥니 다.클래스 멤버 함수가 정상적으로 작동하지만 다른 클래스의 데이터 멤버로 호출 될 때 무한 루프에 멈추다
embedded_tree.t.search() 호출이 이루어지면 "& sentinel"의 내용이 센티넬 노드를 올바르게 가리키고 있지만 새 포인터 인 것으로 나타났습니다. 그것은 root, sentinel.parent 및 sentinel.child의 내용과 동일하지 않습니다. 여기에서 나는 붙어 있고 어떻게 부르는지 모른다. & 센티넬은 트리가 만들어 질 때 생성 된 포인터와 일치한다.
#include <iostream>
struct NODE {
int key;
NODE* parent;
NODE* child;
NODE() : key(0), parent(NULL), child(NULL) {};
};
struct TREE {
NODE sentinel;
NODE* root;
TREE()
{
sentinel = *new NODE;
sentinel.parent = &sentinel;
sentinel.child = &sentinel;
root = &sentinel;
}
NODE* search(int k)
{
NODE* x = root;
while (x != &sentinel)
{
if (x->key == k) return x;
x = x->child;
}
return &sentinel;
}
};
struct A {
TREE t;
A() : t(*new TREE()) {};
};
int main()
{
TREE t;
t.search(1);
A embedded_tree;
embedded_tree.t.search(1);
}
'sentinel = * new NODE;'는 좋지 않습니다. – alain
't (* new TREE())'- 왜 이러는거야? 포인터에 할당하고 필요하지 않으면 사용하지 않는 한'new'를 사용하지 않습니다. (힌트 : 여기서는 필요 없으며 메모리 누수가 발생합니다.) –
'embedded_tree.t.search (1);'함수 호출을 추적 할 때 디버거에서 알려주는 것은 무엇입니까? –