最小堆插入函数

问题描述 投票:0回答:2

这里是最小堆的插入函数。我不明白为什么它不起作用。

void insertHeapMin(Heap* h, int x){
if(isFull(h)){
    printf("heap is full\n");
    return;
}
for(i=0; i<h->size;i++) //I don't wan't to insert one number more than once; 
{
    if(x==h->data[i]) return;
}
int pos = h->size;
h->data[pos]=x;
while(pos>0){
    int parentPos = (pos-1)/2; 
    if (h->data[pos] < h->data[parentPos]){
        int temp = h->data[pos];
        h->data[pos] = h->data[parentPos];
        h->data[parentPos] = temp;
        pos = parentPos;
    } else
        break;
}
h->size++;
}

主要:

int a[] ={4,3,6,4,5};
size_t n = sizeof(a)/sizeof(a[0]);
Heap h;
initHeap(&h,100);
int i;
for(i=0;i<n;i++){
    insertHeapMin(&h, a[i]);
}
for(i=0;i<n;i++){
    printf("%d ",h.data[i]);
}
printf("\n");

它返回3 4 6 51666986547。我真的看不到错误在哪里,当我为max-heap修改插入函数时,它可以完美地工作,当没有重复元素时,仍然看不到如何解决用于重复元素的for循环。

c heap
2个回答
1
投票

在主行2中,您正在计算包​​含重复项的数组(n)的大小。您可能想要更改它,以便只计算唯一的术语。


1
投票

首先,垃圾值1666986547来自何处?此数组元素未初始化,因为您有重复的元素,在插入之前已将其过滤掉。您的原始数组的长度为5,您的堆数组的长度仅为4。打印时,请使用堆大小h.size作为限制。

© www.soinside.com 2019 - 2024. All rights reserved.