将堆作为参数传递
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解释。
我尝试制作几个函数,通过下面的代码将堆作为参数传递。然而,事实并非我所期望的那样。
#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解释。