2016-04-23 2 views
0

Трудно сказать мою проблему в названии. Тем не менее,Распределение структуры с бинарным деревом

Я программирую программу, использующую базу данных структуры. В этой структуре у меня есть информация о базе данных и элементе самой базы данных. Каждый элемент является другой структурой. Пока я объявлял элементы whit просто массивом элементов с определенным размером. Но каждый элемент тяжелый (6 длинный двойной, char [64], некоторый int и вскоре намного больше), и я хочу, чтобы программа могла работать над множеством (возможно, infinte) элементов одновременно, поэтому необходимо использовать много оперативной памяти. Но только иногда программа заполняет массив, поэтому программа занимает много оперативной памяти и работает только с несколькими элементами. Поэтому я решил использовать двоичное дерево, поэтому, когда я хочу поместить другой элемент, я инициализирую новую структуру элементов, и когда я удалю его, программа деаллокод структуры, и я могу иметь элемент «infintie». Но две проблемы поразили меня:

1) Если я вызываю функцию, которая выделяет новую структуру и возвращает указатель на нее, структура не будет автоматически освобождена, потому что функция завершена 2) Элемент распределения программы и dealloc структуры без указания порядка, поэтому массив совершенен, потому что достаточно булевского флага «активный» или «неактивный» для каждой структуры, но в дереве, вещи сложнее, я должен удалить узел, а затем повторно подключить его детей на другой узел, у которого нет детей ...

Как вы думаете? Каждое предложение берется с благодарностью.

ответ

0

Если я правильно понял ваш вопрос, вы хотите иметь много struct element, где sizeof(struct element) довольно большой, и вы хотите динамически добавлять и удалять их во время своей программы.

Это означает, что вы хотите распределить и освободить память для них динамически, поэтому вы хотите использовать malloc() и free(), и вы будете работать с struct elem *. Теперь структура данных для сохранения указателей зависит от операций, которые вы будете выполнять над данными.

Если вам не нужно искать элементы (или их никогда не было в одной точке), если достаточно просто перебирать их, то подходит Linked list. Он позволяет динамически добавлять и удалять элементы, и он эффективен с точки зрения памяти.

Если вам нужно выполнить поиск по элементам, но используя только одну переменную, вы можете поместить свои указатели в binary tree (или hash table).

В противном случае (если вам нужно искать данные с использованием нескольких переменных), вы должны, вероятно, сохранить их в связанном списке и построить двоичное дерево или хеш-таблицу index для ускорения поиска по часто просматриваемым переменным.

Но в этот момент вы можете использовать некоторые существующие СУБД.

+0

спасибо за отличное объяснение. Но если я вызываю функцию, которая выделяет переменную, когда функция возвращает, могу ли я получить к ней доступ? –

+0

Да, если вы все сделаете правильно. См. Мой [другой ответ] (http://stackoverflow.com/questions/36817825/linked-list-head-not-being-updated-across-function-calls/36817919#36817919), который распространяется только на этот –

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