![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 09.11.2014
Сообщений: 12
|
![]()
Доброго времени суток, есть такая проблема: нужно реализовать дерево на паскале, в котором будут звенья с разным количеством указателей в зависимости от количества потомков. Элемент дерева должен иметь тип записи (Record) . Мне не понятно как сделать так чтобы количество полей в записи было не фиксированным(замечу что тут иметься ввиду не нулевые указатели а именно отсутствие указателя). В голову пришла только одна идея это динамический массив внутри записи. Как то так:
Код:
Ошибка времени выполнения: Невозможно упаковать тип "ByProCoder.Node" как неуправляемую структуру; невозможно вычислить размер или смещение, имеющие смысл. Я так полагаю это потому что неизвестно какой объем памяти выделить на динамический массив. Как решить эту проблему? Последний раз редактировалось Stilet; 09.11.2014 в 16:22. |
![]() |
![]() |
![]() |
#2 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
I'm learning to live...
|
|
![]() |
![]() |
![]() |
#3 | |
Новичок
Джуниор
Регистрация: 09.11.2014
Сообщений: 12
|
![]() Цитата:
Конечно проще делать нулевые указатели , если у узла нет потомков , но в задании надо сделать так чтобы таких указателей вообще не было... http://pixs.ru/showimage/shemapng_2013252_14653489.png вот схема такого дерева для примера Последний раз редактировалось Stilet; 09.11.2014 в 18:06. |
|
![]() |
![]() |
![]() |
#4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
А-ля файловая структура... Ну тогда и FAT для такого нужно выдумывать.
Я бы наверное в каждой ветке сделал поля указателя на данные, размер этих данных и их тип. А потом бы описал методы считывания по указателю этих данных и конвертирования во что-то в зависимости от содержимого поля типа. На пальцах наверное не расскажешь... Код:
И так получится список списков с данными неопределенного типа
I'm learning to live...
|
![]() |
![]() |
![]() |
#5 |
Новичок
Джуниор
Регистрация: 09.11.2014
Сообщений: 12
|
![]()
Не совсем понятно что имееться ввиду , но насколько я понял вы добавили указатель еще на следующий элемент на этом же уровне дерева (брат) , это противоречит варианту задания. Вот условие более подробно:
Каждая вершина содержит следующие поля: - поле данных; - поле, в котором указано число координирующих вспомагательных полей; - вспомагательное поле, содержащее указатель на вершину более высокого уровня (предыдущую вершину). Для корневой вершины в него заносится значение NIL; - вспомагательные поля, содержащие указатели на вершины нижнего уровня (у листьев - отсутствуют). Если с текущей вершиной не связаны вершины нижнего уровня, то соответствующие вспомогательные поля отсутствуют То есть должен быть только указатель на родителя , и указатели на потомков, причем число указателей на потомков должно "растягиваться". "Головы" списка не должно быть, все потомки должны быть равнозначны. Родитель должен указывать не на один "главный" потомок а на каждого отдельно(несколько указателей по числу потомков), как изображено на схеме в моем посте выше. Последний раз редактировалось Dvach; 09.11.2014 в 18:44. |
![]() |
![]() |
![]() |
#6 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
Ладно. Пусть будет array of NodePointer. Смысл собственно в описании данных. Вот я и предлагаю их представить нетипированно, но с указанием как именно их понимать.
I'm learning to live...
|
|
![]() |
![]() |
![]() |
#7 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Самый простой вариант - уйти от ссылок. Все узлы элементы динамического массива. Начинается от глобального корневого узла, который недоступен конечному пользователю. Его потомки будут считаться корневыми узлами. Такое проектирование дерева поможет избежать многих проблем, главная из которых утечка памяти при работе с указателями.
В случае использования только динамических массивов в Вашем рекорде count становится не нужным... Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
|
![]() |
![]() |
![]() |
#8 |
Новичок
Джуниор
Регистрация: 09.11.2014
Сообщений: 12
|
![]()
Вот мне тоже нравиться идея с динамачиным массивом, но как выделить память для указателя на record если в нем есть динамический массив размер которого на данном этапе еще неизвестен, я ведь не могу выделить память под массив до того как выделю память для записи.
"Ошибка времени выполнения: Невозможно упаковать тип "ByProCoder.Node" как неуправляемую структуру; невозможно вычислить размер или смещение, имеющие смысл. " Последний раз редактировалось Dvach; 09.11.2014 в 19:04. |
![]() |
![]() |
![]() |
#9 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]() Цитата:
1. Начальная инициализация SetLength(массив, размер) - установите размер в нуль, уничтожите все данные. 2. Добавить элемент в конец: Код:
а) Копируете последний элемент в тот который должен быть удален б) Уменьшаете динамический массив на единицу Код:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
|
![]() |
![]() |
![]() |
#10 |
Новичок
Джуниор
Регистрация: 09.11.2014
Сообщений: 12
|
![]()
1) Нельзя после, так ошибка при выделении памяти под типизированный указатель (размер динамического массива внутри не опеределен)
2) Ну про SetLength я знаю , вот только где мне выделять память под массив? в отдельной функции? и как мне передать указатель в record. Это ведь не экземпляр класса и я не могу вызвать конструктор при выделении памяти под узел. Я конечно могу описать узел как объект а не запись но это уже не совсем то что требуется в задании. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Дерево на C# | No_Comments | Помощь студентам | 8 | 26.04.2013 21:22 |
Дерево | Тюха | Visual C++ | 0 | 23.05.2011 18:50 |
Я дерево | Кукла_колдуна | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 20.03.2011 23:07 |
Дерево | Ikram | Помощь студентам | 0 | 05.05.2010 19:42 |
дерево С# | Natok | Помощь студентам | 0 | 14.09.2009 23:42 |