Я вижу несколько проблем в вашем коде для удаления элемента:
for(i=0;i<=h.end;i++) {
if(x == h.a[i])
break;
}
h.a[i]=h.a[h.end];
h.end=h.end-1;
if(i!=(h.end+1))
minHeapify(&h,i);
Во-первых, если элемент с введенным вами значением не найден, у вас возникнут проблемы из-за i > h.end
. Вы закончите индексированием конца массива или удалением последнего элемента.
Что еще более важно, вы не рассматриваете случай, когда элемент, которым вы его заменяете, меньше, чем родительский. Например, рассмотрим эту кучу:
1
6 2
7 8 3
Если вы удалите узел со значением 7, значение 3 заменит его:
1
6 2
3 8
Это недопустимая куча. Вы должны переместить 3 вверх в куче, чтобы создать:
1
3 2
6 8
Ключевым моментом здесь является то, что если заменяемый элемент находится в другом поддереве, чем последний элемент в куче, возможно, что замещающий узел будет меньше, чем родительский элемент заменяемого узла.
Итак, ваш код должен сделать это:
h.a[i] = h.a[h.end];
h.end = h.end-1;
// here you have to:
// if (h.a[i] < parentOf(h.a[i]))
// move it up the heap
// else
// minHeapify(&h, i);