В вашей (в остальном довольно аккуратной) программе есть две основные ошибки:
Во-первых, вы должны предоставить размер в байтах для malloc
и realloc
, что означает, что где-то должно быть sizeof(T)
, если только вы не выделите массивы char
. Вы делаете это при выделении исходного массива, но забываете его при перераспределении.
Во-вторых, вы используете индекс на основе одного для доступа к массиву. В C массивы начинаются с нуля. Это также относится к данным, размещенным в куче. Первый индекс 0
, а последний действительный индекс heap->size - 1
.
Это означает, что когда вы добавляете элемент, вы используете текущий размер в качестве индекса вставки, а затем увеличиваете размер. (Конечно, вы должны сначала проверить, есть ли пространство, но вы это делаете.) Итак:
// ... allocate if necessary ...
heap->elements[heap->size] = 0;
if (isMinHeap) decreaseKey(heap, heap->size, key);
else increaseKey(heap, heap->size, key);
heap->size++;
Это обычный шаблон, который часто встречается при добавлении содержимого в массив: array[size++] = stuff;
.
Наконец, вам, вероятно, придется обновить функции, которые определяют родителя и потомков:
parent(n) == (n - 1) / 2;
left(n) == 2*n + 1;
right(n) == 2*n + 2;
Не забудьте free
свою память после того, как вы ее использовали.