Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
/*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 );
		}
	}
}