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

C:删除二进制堆的最小元素,c,C,我正在研究二进制堆的C实现,其中最小的元素位于树的底部,而不是最大的元素。然后,树中的每个下一个元素都比上一个元素大 我的问题是当我移除堆中最小的元素时。下面是我定义二进制堆、初始化二进制堆和删除最小元素的代码 struct BinaryHeap { int capacity; int size; int *heap; }; void init_heap(struct BinaryHeap *heap_ptr, int capacity) { heap_ptr-

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

NULL
用于空指针,而不是整数值。您需要将其设置为其他无法获得的值。例如,如果堆中只能有零或正数,则可以将其设置为负值


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

NULL
用于空指针,而不是整数值。您需要将其设置为其他无法获得的值。例如,如果堆中只能有零或正数,则可以将其设置为负值

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