min heap program停止工作

时间:2018-01-05 08:10:53

标签: c data-structures

我正在做一个简单的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;
}

1 个答案:

答案 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的数据类型)指出