ElementType pqDeleteMin( PriorityQueue H ) { int i, Child; ElementType MinElement, LastElement; if( pqIsEmpty( H ) ) { fprintf(stderr, "Priority queue is empty\n" ); return H->Elements[ 0 ]; } MinElement = H->Elements[ 1 ]; LastElement = H->Elements[ H->Size-- ]; for( i = 1; i * 2 <= H->Size; i = Child ) { /* Find smaller child */ Child = i * 2; if(Child != H->Size && H->compareElementType(&(H->Elements[ Child + 1 ]),&(H->Elements[ Child ])) < 0) Child++; /* Percolate one level */ if(H->compareElementType(&(LastElement),&(H->Elements[ Child ])) > 0 ) H->Elements[ i ] = H->Elements[ Child ]; else break; } H->Elements[ i ] = LastElement; return MinElement; }
void pqInsert( ElementType X, PriorityQueue H ) { int i; if( pqIsFull( H ) ) { fprintf(stderr, "Priority queue is full\n" ); return; } for( i = ++H->Size; H->compareElementType(&(H->Elements[ i / 2 ]),&(X)) > 0; i /= 2 ) H->Elements[ i ] = H->Elements[ i / 2 ]; H->Elements[ i ] = X; }
/*Added by J.Callut*/ void pqInsertIfSpaceOrGreaterThanMin(ElementType X, PriorityQueue H){ ElementType min; if( ! pqIsFull( H ) ) pqInsert( X, H ); else{ min = pqFindMin(H); if(H->compareElementType(&(X),&(min)) > 0){ pqDeleteMin(H); pqInsert( X, H ); } } }