我正在做一个简单的minheap程序,但当堆的大小为4时,我得到一个错误程序停止工作。 我检查堆大小2,3,5,6,7程序工作正常。
为什么我只在堆积为4时才会出现此错误?
我正在使用代码块16.01,windows 10,gcc编译器。
minHeap.c
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
void MinHeapfy(int A[], int i, int N)
{
int l,r,temp,smallest;
l = 2*i;
r = 2*i + 1;
if((l<=N) && (A[l]<A[i]))
{
smallest = l;
}
else
{
smallest = i;
}
if((r<=N) && (A[r]<A[smallest]))
{
smallest = r;
}
if(smallest != i)
{
temp = A[smallest];
A[smallest] = A[i];
A[i] = temp;
MinHeapfy(A,smallest,N);
}
}
void BuildHeap(int A[],int N)
{
int i;
int f = floor(N/2);
printf("f %d", f);
for(i=f;i>=1;i--)
{
printf("i %d\n",i);
MinHeapfy(A,i,N);
}
}
int main()
{
int *A,N,T,data,q,i=1;
scanf("%d",&N);
A = (int *)calloc(N,sizeof(int));
for(i=1;i<=N;i++)
{
scanf("%d",&data);
A[i]=data;
}
BuildHeap(A,N);
for(i=1;i<=N;i++)
{
printf("%d ",A[i]);
}
return 0;
}
答案 0 :(得分:0)
我可以分享一些我迄今学到的东西:
void BuildHeap(int *A, int N);
void MinHeapfy(int *A, int i, int N);
在这2个函数中,你只是发送一个指针而不是一个数组(int * A和int A [5]之间的区别)
int main()
{
/*here it is better for you to declare like this
to see more easier which is which pointer and variable
(PS: at the moment you don't use q)*/
int N,T,data,i;//,q
int *A;
scanf("%d",&N);
A = (int *)calloc(N,sizeof(int));
for(i=0;i<N;i++)
{
scanf("%d",&data);
A[i]=data;
}
BuildHeap(A,N);
for(i=0;i<N;i++)
{
printf("%d ",A[i]);
}
return 0;
}
您使用的2个必须从0到N
开始当你写:
A [0]&lt; =&gt;地址由A + 0 * sizeof(A的数据类型)指出
所以0是数组的第一个地址
,最后一个地址是N-1
A [N-1]&lt; =&gt;地址由A +(N-1)* sizeof(A的数据类型)指出