2014-12-16 6 views
1

Для школьного задания на связанных списках я пишу базу данных людей, которые я реализовал двоичным деревом этой структуры:Realloc бинарное дерево - как обновить указатели

typedef struct TPeople { 
    TPeople * m_Parent_1; 
    TPeople * m_Parent_2; 
    int m_ID; 
    char * m_Name; 
} TPEOPLE; 

я создаю массив с кодом:

int allocated = 20; 
TPEOPLE * data = (TPEOPLE*) calloc(allocated, sizeof (TPEOPLE)); 

И realocate с:

allocated *= 2; 
data = (TPEOPLE*) realloc(data, allocated * sizeof (TPEOPLE)); 
memset(data + allocated /2,0,allocated/2 * sizeof (TPEOPLE)); 

Потому что каждый человек будет без ребенка для некоторых я сохранил их в массиве, иначе я бы не нашел их снова.

Но проблема возникает, поскольку размер по умолчанию для массива будет недостаточным для их хранения. Но когда я перераспределяю массив, все те родительские указатели указывают в старом расположении в уже свободной памяти.

Как решить эту проблему?

Благодаря Rfilip

+0

Не могли бы вы разместить свои объявления о размещении и объявлении массива. –

ответ

3

Это не правильный способ выделить двоичные узлы дерева. Как правило, каждый узел равен независимо: им не нужно находиться в физически смежной памяти, потому что они имеют указатели друг на друга. Поэтому вам не нужен массив из них.

Если вы хотите отслеживать все ваши узлы для освобождения их позже, вы можете просто поместить указатели на каждый узел в большем массиве указателей на узлы, который вы можете realloc, как вам угодно ,

+0

Я знаю, но, как я сказал, каждый человек будет без ребенка и без какого-либо указателя на него в течение некоторого времени. И массив - способ держать указатели. – Rfilip

+2

Распределите своих детей по мере их создания и не забудьте поместить их в массив, когда они есть. (Или просто сделайте так, как мой второй пункт, и сделайте realloc'able массив указателей на узлы) – nneonneo

+0

Хорошо, спасибо, я сделаю, как ваш второй пункт состояния. – Rfilip

Смежные вопросы