병합, 삽입 및 패치 기능을 사용하여 우선 순위 대기열을 만듭니다. 테스트 프로그램은 데이터와 우선 순위를 제공하여 노드를 삽입하고, 노드를 생성하고이를 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
을 검사 할 때 오류가 발생합니다. 어떤 도움을 주셔서 감사합니다.