将堆作为参数传递

Passing a heap as an argument

我尝试制作几个函数,通过下面的代码将堆作为参数传递。然而,事实并非我所期望的那样。

#include<stdio.h>

void upHeap_min2 (int *heap, int index)
{
    if (index == 0)
        return;

    int parentIdx = getParentIdx(index);
    if (heap[index] < heap[parentIdx])
    {
        int temp = heap[index];
        heap[index] = heap[parentIdx];
        heap[parentIdx] = temp; 

        upHeap_min2(heap, parentIdx);
    }
}

void pushValue (int *heap, int count, int value)
{
    count++;
    heap[count] = value;
    upHeap_min2(heap, count);   
}

void view(int *heap, int count)
{
    printf("Values inside heap: ");
    for (int i = 0; i < count; i++)
    {
        printf("%d ", heap[i]);
    }
    printf("\n");
}

int main()
{
    int heapDemo[101];
    int count = -1;
    pushValue(heapDemo, count, 30);
    pushValue(heapDemo, count, 20);
    pushValue(heapDemo, count, 40);
    pushValue(heapDemo, count, 90);
    pushValue(heapDemo, count, 10);

    view(heapDemo, count);

    return 0;
}

获取父索引的函数:

int getParentIdx (int index)
{
    return (index-1)/2;
}

上面的代码应该打印出来了

10 20 40 90 30

但是它什么也没打印。我也想过将它作为双指针传递,但我没有工作。这是否意味着我不能将堆作为参数传递(这意味着我必须将堆声明为全局变量)或者有另一种方法可以做到这一点?

这是一个有效的解决方案,让我解释一下

#include<stdio.h>

void upHeap_min2 (int *heap, int index)
{
    if (index == 0)
        return;

    int parentIdx = getParentIdx(index);
    if (heap[index] < heap[parentIdx])
    {
        int temp = heap[index];
        heap[index] = heap[parentIdx];
        heap[parentIdx] = temp; 

        upHeap_min2(heap, parentIdx);
    }
}
int getParentIdx (int index)
{
    return (index-1)/2;
}

void pushValue (int *heap, int *count, int value)
{
    *count = *count + 1;
    heap[*count] = value;
    upHeap_min2(heap, *count);   
}

void view(int *heap, int *count)
{
    printf("Values inside heap: ");
    for (int i = 0; i <= *count; i++)
    {
        printf("%d ", heap[i]);
    }
    printf("\n");
}

int main()
{
    int heapDemo[101];
    int conter = -1; //new var
    int *count = &conter;
    pushValue(heapDemo, count, 30);
    pushValue(heapDemo, count, 20);
    pushValue(heapDemo, count, 40);
    pushValue(heapDemo, count, 90);
    pushValue(heapDemo, count, 10);

    view(heapDemo, count);

    return 0;
}

主要错误是您将计数器作为简单变量传递,而您应该将其作为指针传递,这导致 counter 永远不会递增,所以我创建了一个指向该变量的指针,现在 counter 递增并打印出您期望的内容。此外,我还修改了您用来打印值的正文

您的 pushValue 函数采用 count 参数 by value (这意味着该函数接收 copy的数据),所以它永远不会在 main 函数中被修改。相反,您应该将 count 作为指针传递,并且(因此)需要在函数内部取消引用它:

void pushValue(int* heap, int* count, int value)
{
    ++(*count);
    heap[*count] = value;
    upHeap_min2(heap, *count);
}

然后,在main中,你应该使用count地址来调用它:

    pushValue(heapDemo, &count, 30); // And similarly for the other calls

此外,您的 view 函数中的循环还差一个结尾就停止了。将循环限制更改为 i <= count。 (这个函数 使用 count 但没有 修改 它,所以按值传递是可以的。):

void view(int* heap, int count)
{
    printf("Values inside heap: ");
    for (int i = 0; i <= count; i++) {
        printf("%d ", heap[i]);
    }
    printf("\n");
}

随时要求进一步澄清and/or解释。