Выделение памяти для кучи с помощью malloc - PullRequest
0 голосов
/ 06 мая 2019

У меня проблемы с объявлением новой кучи, пустой, с максимальным размером "емкость".

Структура кучи:

typedef struct {
    /* number of elements on vector */
    int size;
    /* vector max size */
    int capacity;
    /*vector of pointers for elements*/
    element_t** elements;
} heap;

Элемент_t структура:

typedef struct element_
{
    char nameItem[100];
    char expirationDate[11];
    int qty;
    int sellRate;
    float priorityVal;
} element_t;

Функция, которая мне нужна для создания кучи, объявляется так, где аргумент емкость - это емкость кучи.

heap* new_heap(int capacity){

Функция, которая вставляет элементы в кучу:

int heap_insert(heap *h, element_t* elem)
{
    element_t * aux;
    int i;
    //gilc
    if(!h) return 0;
    /* if heap is full, dont insert element */
    if (h->size >= h->capacity)
        return 0;

    if (!elem)
        return 0;

    /* insert element in the end of the heap */
    h->size++;
    i = h->size;
    h->elements[i] = elem;

    /* while element has more prioritary than his father, trade them */
    while (i != ROOT && bigger_than(h->elements[i], h->elements[FATHER(i)]))
    {
        aux = h->elements[FATHER(i)];
        h->elements[FATHER(i)] = h->elements[i];
        h->elements[i] = aux;
        i = FATHER(i);
    }
    return 1;

    //Default
    return 0;
}

ОТЕЦ и КОРЕНЬ определены таким образом (я не понимаю, что это значит, было также предопределено для проекта)

#define FATHER(x)       (x/2)
#define ROOT        (1)

и bigger_than вот так:

int bigger_than(element_t* e1, element_t* e2)
{
    if (e1 == NULL || e2 == NULL)
    {
        return 0;
    }

    return e1->priorityVal > e2->priorityVal;
}

Какие вызовы malloc мне нужно использовать? Функция new_heap должна выделять всю память, необходимую для количества элементов, указанных в качестве аргумента емкости.

1 Ответ

1 голос
/ 06 мая 2019
heap *new_heap(int capacity) {
    heap *h = malloc(sizeof(heap));
    h->size = 0;
    h->capacity = capacity;
    h->elements = malloc(capacity * sizeof(element_t *));
    return h;
}

Первый malloc освободит достаточно места для вашей структуры кучи. Второй относится к «вектору» (как вы его назвали) указателей на элементы, поскольку они должны храниться в отдельном месте в памяти (основываясь на вашем объявлении heap). Вместе это выделяет всю память, необходимую для кучи. Я предполагаю, что у вас также будет функция new_element, которая будет обрабатывать выделение памяти для отдельного элемента для вас всякий раз, когда вы захотите добавить что-то к heap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...