我正在处理二进制堆的C实现,其中最小元素位于树的底部而不是最大的。然后,树中的每个下一个元素都比前一个元素大。
我的问题是当我删除堆中最小的元素时。这是我的代码,用于定义二进制堆,初始化一个,并删除最小元素。
struct BinaryHeap
{
int capacity;
int size;
int *heap;
};
void init_heap(struct BinaryHeap *heap_ptr, int capacity)
{
heap_ptr->capacity = capacity;
heap_ptr->size = 0;
double n = ceil(pow(2, log10(capacity)/log10(2)));
heap_ptr->heap = (int *)malloc(n*sizeof(int));
}
int remove_heap(struct BinaryHeap *heap_ptr)
{
if (heap_ptr->size > 0)
{
int min_item = heap_ptr->heap[1];
heap_ptr->heap[1] = heap_ptr->heap[heap_ptr->size];
heap_ptr->size--;
heap_ptr->heap[1] = NULL; // I get a warning here
if (heap_ptr->size > 0)
{
heapify(heap_ptr, 1); // helper function which percolates the heap after removal
}
return min_item;
}
return 0;
}
答案 0 :(得分:2)
NULL
用于空指针,不用于整数值。您需要将其设置为其他一些无法实现的值。例如,如果堆中只能包含零或正数,则可以将其设置为负值。
如果您的值可以跨越整个整数范围,那么您需要一些其他方法来跟踪未使用的条目。例如,通过让第二个数组包含一个布尔标志来说明heap
中的相应值是否有效。