2012-06-08 3 views
0

병합, 삽입 및 패치 기능을 사용하여 우선 순위 대기열을 만듭니다. 테스트 프로그램은 데이터와 우선 순위를 제공하여 노드를 삽입하고, 노드를 생성하고이를 Leftist Tree Heap Priority Queue 내에 배치하려고 시도합니다.NULL을 확인할 때 세그먼트 화 오류가 발생했습니다. 노드

template<class DATA> 
Node<DATA> * 
PQueue<DATA> :: merge (Node<DATA> * p , Node<DATA> * q) 
{ 
    unsigned d1, d2; 

    if (p == NULL) return q ; 
    if (q == NULL) return p ; 

    if ((p->priority) < (q->priority)) // p is final root. 
     swap(p,q) ; 

    p->right = merge (p->right , q); 

    d1 = p->left->distance; 
    d2 = p->right->distance; 

    if (d1 < d2) 
     swap(p->left,p->right) ; // leftist tree. 

    p->distance = 1 + p->right->distance ; 

    return p ; 
} 

template<class DATA> 
void 
PQueue<DATA> :: swap (Node<DATA> * p, Node<DATA> * q) 
{ 
    Node<DATA> * temp; 
    temp = p; 
    p = q; 
    q = temp; 
    delete temp; 
} 

template < class DATA > 
bool 
PQueue<DATA> :: insertPQ (DATA & data , double priority) 
{ 
    root = merge(root, new Node<DATA>(data, priority)); 
    return true; 
} 

가 삽입에 대한 테스트 코드는 이것이다 : 이것은 내 코드 병합 및 스왑을 사용하여 노드를 삽입하는 것입니다

template <class DATA> 
class Node { 
    public : 
    DATA data ; 
    double priority ; 
    unsigned distance ; 
    Node<DATA> * left , * right ; 

    Node (DATA & d , double prio) : data (d) , priority(prio) , 
    distance(0) , left(NULL) , right(NULL) {} ; 
} ; 

:

는 클래스 노드에 대한 코드입니다 :

pq.insertPQ(data[i] , data[i]) 

첫 번째 삽입물이 정상적으로 작동합니다. 두 번째 삽입은 병합 함수에 도착하고 p->right = merge (p->right , q);에 첫 번째 순환 루프를 입력하고에 대한 seg 오류를 제공합니다. (p == NULL) return q ; 일부 검사를 수행 한 후에 p는 NULL을 확인했지만 아직이 경우 p == NULL을 검사 할 때 오류가 발생합니다. 어떤 도움을 주셔서 감사합니다.

답변

1

나는 그것이 당신이 생각하는 곳에 실제로 충돌하지 않는다고 생각합니다.

당신은 몇 가지 버그가 있습니다. 먼저, 스왑 함수는 주어진 포인터를 스왑하지만 트리에는 아무런 영향을 미치지 않습니다. 나는 당신이 그 논증을 참조하도록 의도했다고 생각한다 : swap (Node<DATA> *&p, Node<DATA> *&q)

둘째로, 노드를 삭제했지만 아직 할당하지 않았다는 것에주의한다. 당신은 p 노드를 자유롭게하고 있습니다. 이로 인해 segfault가 발생할 수 있습니다.

관련 문제