/* Brise objekat najviseg prioriteta sa gomile */ #define LEFT(k) (2*k) #define RIGHT(k) (2*k+1) #define EMPTY(c,k) (k>=c->item_cnt) #define SWAP(i,j) { void *x = c->items[i]; \ c->items[i] = c->items[j]; \ c->items[j] = x; } void MoveDown( Collection c, int k ) { int larger, right, left; left = LEFT(k); right = RIGHT(k); if ( !EMPTY(c,k) ) /* Uslov za prekid! */ { larger=left; if ( !EMPTY(c,right) ) { if ( ItemCmp( c->items[right], c->items[larger] ) > 0 ) larger = right; } if ( ItemCmp( c->items[k], c->items[larger] ) ) { SWAP( k, larger ); MoveDown( c, larger ); } } } void *HighestPriority( Collection c ) /* Vraca objekat sa najvisim prioritetom Pre-uslovi: (c je skup kreiran pozivom ConsCollection) && (postojeci broj objekata >= 1) && (item != NULL) Post-uslovi: objekat je obrisan iz c */ { int i, cnt; void *save; assert( c != NULL ); assert( c->item_cnt >= 1 ); /* Sacuvaj koren */ save = c->items[0]; /* Stavi poslednji objekat na mesto korena */ cnt = c->item_cnt; c->items[0] = c->items[cnt-1]; /* Smanji broj objekata za jedan */ c->item_cnt--; /* Pomeri novi objekat iz korena nadole dok je potrebno */ MoveDown( c, 1 ); return save; }