Esempio n. 1
0
int main(int argc, char *argv[])
{
    struct binheap uut;

    binheap_init(&uut, cmp, sizeof(int), 0, realloc);

    assert(binheap_isempty(&uut));

    binheap_destroy(&uut);

    return 0;
}
Esempio n. 2
0
int main(int argc, char *argv[])
{
    binheap_t h;
    int32_t a[1024];
    int32_t i, j, r;
    int32_t parent, child;
    binheap_node_t *nodes[1024];
    
    for (i = 0; i < 1024; i++) {
        a[i] = 1024 - i;
    }
    
    binheap_init(&h, compare_int, NULL);
    for (i = 0; i < 1024; i++) {
        binheap_insert(&h, a + i);
    }
    
    for (i = 0; i < 1024; i++) {
        parent = (i - 1) / 2;
        child = (2 * i) + 1;
        if (!i) {
            if (*(int *) h.array[i]->datum > *(int *) h.array[child]->datum ||
                *(int *) h.array[i]->datum > *(int *) h.array[child + 1]->datum) {
                printf("Error follows:\n");
            }
            printf("%4d:      %4d %4d %4d\n",
                   h.array[i]->index,
                   *(int *) h.array[i]->datum,
                   *(int *) h.array[child]->datum,
                   *(int *) h.array[child + 1]->datum);
        } else if (i < (h.size - 1) / 2) {
            if (*(int *) h.array[i]->datum < *(int *) h.array[parent]->datum ||
                *(int *) h.array[i]->datum > *(int *) h.array[child]->datum ||
                *(int *) h.array[i]->datum > *(int *) h.array[child + 1]->datum) {
                printf("Error follows:\n");
            }
            printf("%4d: %4d %4d %4d %4d\n",
                   h.array[i]->index,
                   *(int *) h.array[parent]->datum,
                   *(int *) h.array[i]->datum,
                   *(int *) h.array[child]->datum,
                   *(int *) h.array[child + 1]->datum);
        } else {
            if (*(int *) h.array[i]->datum < *(int *) h.array[parent]->datum) {
                printf("Error follows:\n");
            }
            printf("%4d: %4d %4d\n",
                   h.array[i]->index,
                   *(int *) h.array[parent]->datum,
                   *(int *) h.array[i]->datum);
        }
    }
    
    binheap_delete(&h);
    
    binheap_init_from_array(&h, a, sizeof (*a), 1024, compare_int, NULL);
    
    for (i = 0; i < 1024; i++) {
        parent = (i - 1) / 2;
        child = (2 * i) + 1;
        if (!i) {
            if (*(int *) h.array[i]->datum > *(int *) h.array[child]->datum ||
                *(int *) h.array[i]->datum > *(int *) h.array[child + 1]->datum) {
                printf("Error follows:\n");
            }
            printf("%4d:      %4d %4d %4d\n",
                   h.array[i]->index,
                   *(int *) h.array[i]->datum,
                   *(int *) h.array[child]->datum,
                   *(int *) h.array[child + 1]->datum);
        } else if (i < (h.size - 1) / 2) {
            if (*(int *) h.array[i]->datum < *(int *) h.array[parent]->datum ||
                *(int *) h.array[i]->datum > *(int *) h.array[child]->datum ||
                *(int *) h.array[i]->datum > *(int *) h.array[child + 1]->datum) {
                printf("Error follows:\n");
            }
            printf("%4d: %4d %4d %4d %4d\n",
                   h.array[i]->index,
                   *(int *) h.array[parent]->datum,
                   *(int *) h.array[i]->datum,
                   *(int *) h.array[child]->datum,
                   *(int *) h.array[child + 1]->datum);
        } else {
            if (*(int *) h.array[i]->datum < *(int *) h.array[parent]->datum) {
                printf("Error follows:\n");
            }
            printf("%4d: %4d %4d\n",
                   h.array[i]->index,
                   *(int *) h.array[parent]->datum,
                   *(int *) h.array[i]->datum);
        }
    }
    
    while (!binheap_is_empty(&h)) {
        binheap_remove_min(&h);
        
        for (i = 0; i < h.size; i++) {
            parent = (i - 1) / 2;
            child = (2 * i) + 1;
            if (h.size == 1) {
                printf("%4d:      %4d\n",
                       h.array[i]->index,
                       *(int *) h.array[i]->datum);
            } else if (!i) {
                if (*(int *) h.array[i]->datum > *(int *) h.array[child]->datum ||
                    *(int *) h.array[i]->datum > *(int *) h.array[child + 1]->datum) {
                    printf("Error follows:\n");
                }
                printf("%4d:      %4d %4d %4d\n",
                       h.array[i]->index,
                       *(int *) h.array[i]->datum,
                       *(int *) h.array[child]->datum,
                       *(int *) h.array[child + 1]->datum);
            } else if (i < (h.size - 1) / 2) {
                if (*(int *) h.array[i]->datum < *(int *) h.array[parent]->datum ||
                    *(int *) h.array[i]->datum > *(int *) h.array[child]->datum ||
                    *(int *) h.array[i]->datum > *(int *) h.array[child + 1]->datum) {
                    printf("Error follows:\n");
                }
                printf("%4d: %4d %4d %4d %4d\n",
                       h.array[i]->index,
                       *(int *) h.array[parent]->datum,
                       *(int *) h.array[i]->datum,
                       *(int *) h.array[child]->datum,
                       *(int *) h.array[child + 1]->datum);
            } else {
                if (*(int *) h.array[i]->datum < *(int *) h.array[parent]->datum) {
                    printf("Error follows:\n");
                }
                printf("%4d: %4d %4d\n",
                       h.array[i]->index,
                       *(int *) h.array[parent]->datum,
                       *(int *) h.array[i]->datum);
            }
        }
    }
    
    binheap_delete(&h);
    
    binheap_init(&h, compare_int, NULL);
    for (i = 0; i < 1024; i++) {
        nodes[i] = binheap_insert(&h, a + i);
    }
    
    for (i = 0; i < 1024; i++) {
        printf("%d\n", *(int *) nodes[i]->datum);
    }
    
    for (j = 0; j < 1; j++) {
        r = 1020;
        a[r] = 0;
        binheap_decrease_key(&h, nodes[r]);
        for (i = 0; i < h.size; i++) {
            parent = (i - 1) / 2;
            child = (2 * i) + 1;
            if (h.size == 1) {
                printf("%4d:      %4d\n",
                       h.array[i]->index,
                       *(int *) h.array[i]->datum);
            } else if (!i) {
                if (*(int *) h.array[i]->datum > *(int *) h.array[child]->datum ||
                    *(int *) h.array[i]->datum > *(int *) h.array[child + 1]->datum) {
                    printf("Error follows:\n");
                }
                printf("%4d:      %4d %4d %4d\n",
                       h.array[i]->index,
                       *(int *) h.array[i]->datum,
                       *(int *) h.array[child]->datum,
                       *(int *) h.array[child + 1]->datum);
            } else if (i < (h.size - 1) / 2) {
                if (*(int *) h.array[i]->datum < *(int *) h.array[parent]->datum ||
                    *(int *) h.array[i]->datum > *(int *) h.array[child]->datum ||
                    *(int *) h.array[i]->datum > *(int *) h.array[child + 1]->datum) {
                    printf("Error follows:\n");
                }
                printf("%4d: %4d %4d %4d %4d\n",
                       h.array[i]->index,
                       *(int *) h.array[parent]->datum,
                       *(int *) h.array[i]->datum,
                       *(int *) h.array[child]->datum,
                       *(int *) h.array[child + 1]->datum);
            } else {
                if (*(int *) h.array[i]->datum < *(int *) h.array[parent]->datum) {
                    printf("Error follows:\n");
                }
                printf("%4d: %4d %4d\n",
                       h.array[i]->index,
                       *(int *) h.array[parent]->datum,
                       *(int *) h.array[i]->datum);
            }
        }
    }
    
    binheap_delete(&h);
    
    return 0;
}