2016-12-28 2 views
0

AVL 트리와 순위 트리가 관련된 과제가 있습니다. 이 특정 지정에서 노드에 다른 정보를 유지하는 순위 AVL 트리를 구현해야합니다.

나는이 문제가있다 :
AVL 트리를 만들었고 순위 트리에 대해 나는 상속을 사용하기로 결정했다.
Rank 트리의 "Insert"함수에서 나는 노드를 인수로받는 "setAllHeights"라는 다른 함수를 호출합니다.
그러나 디버거에서 인수의 값을 볼 때 함수가 NULL 포인터를받는 것을 볼 수 있습니다.
"setAllHeights"함수를 입력하기 전에 인수의 값을 검사했기 때문에 가장 명확하게 NULL이 아니었기 때문에 이유를 알지 못합니다.
무엇이 문제 일 수 있으며 그 이유는 무엇입니까?

귀하의 도움에 감사드립니다.C++ 포인터가 함수 호출 후 값을 상실합니다.


함수 삽입의 코드 :

template<class T, class Compare> 
bool RAVL<T, Compare>::insert(const T& data) { 
    if (root == NULL) { 
     root = new (nothrow) RNode<T, Compare>(data, NULL); 
     if (!root) 
      throw AllocationError(); 
     size++; 
     return true; 
    } 
    Compare cmp; 
    RNode<T, Compare> *v; 
    if (find(data, &v)) 
     return false; 
    if (cmp(v->data, data)) { 
     v->right = new (nothrow) RNode<T, Compare>(data, v); 
     if (!v->right) 
      throw AllocationError(); 
    } else { 
     v->left = new (nothrow) RNode<T, Compare>(data, v); 
     if (!v->left) 
      throw AllocationError(); 
    } 
    Node<T,Compare> * n=v; 
    AVL<T,Compare>::setAllHeights(n); 
    rebalance(v); 
    size++; 
    return true; 
} 


setAllHeights 함수의 코드 :

당신이 절 초기화되지 않은 것을 날 것으로 보인다
template<class T, class Compare> 
void AVL<T, Compare>::setAllHeights(Node<T, Compare> *n) { 
    if (n == NULL) { 
     return; 
    } 
    setHeight(n); 
    setAllHeights(n->parent); 
} 
+0

이러한 문제를 해결하는 올바른 도구는 디버거입니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 문제를 재현하는 [최소, 완료 및 확인 가능] (http://stackoverflow.com/help/mcve) 예제와 함께 해당 질문을 \ [편집]해야합니다. 디버거. –

+0

이것은 정확히 내가 한 일입니다 .. 나는 디버거에서 함수가 NULL 포인터를 받았다는 것을 알았습니다. 왜 그런 일이 일어나는지 이해하지 못합니다. – kidneyThief

+0

디버그 빌드를 수행하고 있습니까? 때때로 최적화 된 빌드에서 이상한 것을 볼 수 있습니다. –

답변

1

, 따라서 n에 할당하면 초기화되지 않습니다. v = new RNode (...) 또는 논리가 무엇이든간에 호출해야합니다.

+0

"find"함수로 v를 초기화하고 있습니다. 그것은 제가 삽입해야 할 노드를 찾습니다. 이 기능은 작동합니다. 난 그냥 디버거에서 실제로 NULL이 아닌 경우 함수가 NULL 포인터를받는 이유를 알고 싶다. – kidneyThief

+0

@ kidneyThief ** [MCVE] ** 귀하의 질문에 !!!! –

+0

나는 시도 할 것이다. 감사. – kidneyThief