C:删除二进制堆的最小元素

时间:2016-03-21 12:41:16

标签: c

我正在处理二进制堆的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;
}

1 个答案:

答案 0 :(得分:2)

NULL用于空指针,不用于整数值。您需要将其设置为其他一些无法实现的值。例如,如果堆中只能包含零或正数,则可以将其设置为负值。

如果您的值可以跨越整个整数范围,那么您需要一些其他方法来跟踪未使用的条目。例如,通过让第二个数组包含一个布尔标志来说明heap中的相应值是否有效。