Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2016, 23:25   #1
Алексей Григорьев
 
Регистрация: 22.06.2014
Сообщений: 6
По умолчанию Бинарные деревья поиска(Delphi)

Всем доброго времени суток! Нужна помощь в следующем вопросе)
Передо мной встала задача реализовать программу для работы с деревьями поиска. Все необходимые методы класса описал и проверил, однако есть проблема с деструктором. При завершении программы вызываю его, после чего получаю ошибку(во вложении).
Описание типа дерева и класса:
Код:
Type
   Tree=^s;
   S=record
      key:byte;
      Inf: ^ShortString;
      Left , right : Tree ;
End ;




type MainTree = class
  First:Tree;

  public
  constructor Create();
  constructor CreateFile();
  procedure Add(kr:byte; info:string);
  procedure Remove( var root : tree ; key : integer );
  procedure Search(key: byte; var Tr:Tree);
  procedure Output(Tr:tree);
  procedure findMin();
  destructor final(var Tr:Tree);

end;
код деструктора:
Код:
destructor MainTree.final(var Tr:Tree);
begin

  if Tr<>nil then
    begin
      final(Tr^.Left);
      final(Tr^.right);
      dispose(Tr);
    end;

end;
В результате выполнения метода, после достижения первого узла-листа без потомков, и не выполнения условия Tr<>nil, метод возвращается на уровень выше и переходит в правого потомка, который также nil. Однако далее, как только условие не удовлетворяется в правом поддереве, после выхода на верхний уровень, возникает вышеупомянутая ошибка и dispose не выполняется. В программировании я новичок, поэтому прошу вашей помощи) Хочу узнать, в чем проблема с деструктором. Простите за возможно неясное описание проблемы) Заранее спасибо
Изображения
Тип файла: png Снимок.PNG (6.1 Кб, 61 просмотров)
Алексей Григорьев вне форума Ответить с цитированием
Старый 10.05.2016, 00:39   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

ООП так не работает.
Если ты объявил класс дерева, то пусть он и работает с деревом ибо это его собственность.... не передавай внешнее, чужое, дерево в методы, а используй своё, которым владеет объект описанного тобой класса (судя по всему, поле First)
ООП призвано снизить сложность.... снизилась ли она? - Нет, ведь раньше (ну, если класс убрать) ты писал Output(root), а теперь пишешь obj.Output(root) т.е. должен теперь помнить и про root и про obj..... если же делать правильно, то на данном этапе мы должны получить obj.Output() т. е., как минимум, не усложнять эту часть
в случае же Add мы уже получаем obj.Add(value), что тоже не сложнее, чем без классов

ошибка же возникает т. к. ты считаешь деструктор обычным методом и вызываешь его рекурсивно.... фактически, ты пытаешься много раз уничтожить объект... сделай обычный метод freeNode, который и будет уничтожать дерево, а в деструкторе уже вызывай его (опять же, это тоже не ООП... там иные механизмы есть, но хотя бы так сделай)
GreenWizard вне форума Ответить с цитированием
Старый 10.05.2016, 14:59   #3
Алексей Григорьев
 
Регистрация: 22.06.2014
Сообщений: 6
По умолчанию

Спасибо, исправил ошибку. Действительно, несколько раз пытался уничтожить объект
Алексей Григорьев вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарные деревья поиска(Паскаль) shadezx Помощь студентам 2 25.11.2014 19:58
Бинарные деревья поиска nyzam7 Общие вопросы Delphi 0 13.05.2012 01:55
бинарные деревья поиска DmuS Помощь студентам 0 27.05.2010 14:33
Бинарные деревья в Delphi Ира08 Помощь студентам 3 04.04.2009 17:20