******** fig6.12 ********** element_type delete_min( PRIORITY_QUEUE H ) { unsigned int i, child; element_type min_element, last_element; /*1*/ if( is_empty( H ) ) { /*2*/ error("Priority queue is empty"); /*3*/ return H->elements[0]; } /*4*/ min_element = H->elements[1]; /*5*/ last_element = H->elements[ H->size-- ]; /*6*/ for(i=1; i*2<=H->size; i=child ) { /*7*/ child = i*2; /* find smaller child */ /*8*/ if((child!=H->size) && (H->elements[child+1] < H->elements[child])) /*9*/ child++; /*10*/ if( last_element > H->elements[child] ) /*percolate */ /*11*/ H->elements[i] = H->elements[child]; else /*12*/ break; } /*13*/ H->elements[i] = last_element; /*14*/ return min_element; }