我想用自定义元素创建二进制堆,并且堆使用struct Elem
数组来存储数据。但是在插入之后,一些数据会丢失,在这种情况下是key
值。
#include <stdlib.h>
#include <stdio.h>
#define DEFAULT_CAPACITY 16
#define VALS 10
const int values[VALS] = {1, 2, 3, 4, 7, 8, 9, 10, 14, 16};
typedef int (*compareFunction)(const void *, const void *);
typedef struct Elem {
void *key;
void *value;
} Elem;
typedef struct Heap {
unsigned int size;
unsigned int capacity;
Elem **array;
compareFunction compare;
} Heap;
Heap *hpCreate(compareFunction compare)
{
Heap *heap;
heap = (struct Heap *) malloc(sizeof(struct Heap));
if (heap == NULL) return NULL;
if ((heap->array = (struct Elem **) malloc(0)) == NULL) {
free(heap);
return NULL;
}
heap->size = 0;
heap->capacity = DEFAULT_CAPACITY;
heap->compare = compare;
return heap;
}
Elem *hpCreateElem(void *key, void *value)
{
Elem *el;
el = (struct Elem *) malloc(sizeof(struct Elem));
if (el == NULL) return NULL;
el->key = key;
el->value = value;
return el;
}
void hpInsert(Heap *hp, void *key, void *value)
{
Elem *el, *par;
int pos;
pos = hp->size++;
el = hpCreateElem(key, value);
par = hp->array[pos/2];
while (pos > 1 && hp->compare(el->key, par->key) > 0) {
hp->array[pos] = hp->array[pos/2];
pos = pos/2;
par = hp->array[pos/2];
}
hp->array[pos] = el;
}
int compare_int_ptr(const void *ptr1, const void *ptr2)
{
int v1 = *((int *) ptr1);
int v2 = *((int *) ptr2);
if (v1 == v2)
return 0;
else
return (v1 > v2) ? 1 : -1;
}
int main()
{
Heap *hp;
Elem *el;
int i;
hp = hpCreate(compare_int_ptr);
for (i = 0; i < VALS; i++) {
hpInsert(hp, (void *) &values[i], (void *) &values[i]);
}
for (i = 0; i < VALS; i++) {
el = hp->array[i];
printf("%d\n", *((int *) el->key));
}
return 0;
}
产生的输出是
4196700
16
14
9
10
4
3
8
17231984
7
而不是正确排序为16 9 14 7 4 8 10 3 2 1
答案 0 :(得分:2)
由于你告诉容器你分配了DEFAULT_CAPACITY元素:
malloc(0)
然后:
malloc(DEFAULT_CAPACITY * sizeof(Elem*))
应该是
par = hp->array[pos/2];
该行:
merge
正在读取未初始化的对象。