void heap_increase_priority(heap_t *heap, heap_item_t* item, double new_priority, double (*compute_priority)(heap_item_t*), void (*set_priority)(heap_item_t*,double)) { // assumes that priority and node mass are one and the same double new_mass; if (new_priority < compute_priority(item)) { fprintf(stderr,"New priority is smaller than current priority.\n"); return; } new_mass = new_priority - item->node_mass; set_priority(item,new_priority); item->node_mass = new_priority; item->subtree_mass += new_mass; while (item->index > 0 && compute_priority(heap_parent(heap, item)) < compute_priority(item)) { heap_parent(heap,item)->subtree_mass += new_mass; heap_exchange(heap, item, heap_parent(heap, item)); item = heap_parent(heap, item); } while (item->index > 0) { heap_parent(heap,item)->subtree_mass += new_mass; item = heap_parent(heap, item); } }
static void heap_heapify(struct heap_list *h, int i) { int l, r, largest; void **p; restart: l = HEAP_LEFT(i); r = HEAP_RIGHT(i); p = h->heap_data; if (l < h->heap_keys && (h->heap_comp_fun(p[l], p[i]) > 0)) largest = l; else largest = i; if (r < h->heap_keys && h->heap_comp_fun(p[r], p[largest]) > 0) largest = r; if (largest != i) { heap_exchange(h, i, largest); i = largest; goto restart; } }