![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Zero |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: 8 Всего: 24 |
Народ, у меня такая проблемма:
У меня курсач в котором нужно составить прог-у чтобы она переводила инфиксную запись в постфиксную, но в задании есть такие условия: 1) исходное выражение описывается бинарным деревом; 2) для представления дерева использовать списки потомков реализованых в динамической памяти. ............ Впринципе саму прогу то я уже написал, вот только в ней какаято ошибка, причём не понятно почему (по моему представлению всё правильно, но прог-а не работает); Сама ошибка как я понимаю, находится при удалении вершины. Но вот как её исправить, я не знаю??? Если кто сможет помочь мне с этим, буду очень признателен!!! Замечание: На вид здесь код большой но на самом деле основная судь начинается после слов "Начало алгоритма"... Код:
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
В чём заключается ошибка ?
-------------------- С уважением, г-н Посол. |
|||
|
||||
| Zero |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: 8 Всего: 24 |
Ну например, если есть дерево, дапустим из трёх вершин, где 1-ая вершин например корень,
2-ая -- левый потомок, а 3-ья правый потомок, то при выполнении программы в моём разделе "(*** Начало алгоритма ***)", сначала выполнится проверка: если левый потомок присутствует то NTR:=номер этого потомка и Repeat, повторится, а так как у 2-ой вершины левого потомка нет, то выполнится третье условие, где эта вершина занесётся в Result, и должна будет удалится, но она при очередном проходе в поисках следующей вершины снова заносится в NTR и TR... И где тут ошибка никак немогу понять... |
|||
|
||||
| p0s0l |
|
||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Вопрос:
Что в итоге должно получиться ? Какая строка ? Потом, сам подумай, в твоём примере про 3 вершины:
1) NTR = корень 2) в Repeat сработало первое условие, теперь: NTR = левый потомок, TR = "1" 3) в Repeat сработало третье условие, теперь: Result := "1 ", NTR = корень, имя вершины №2 = "" (удалена) 4) в Repeat сработало первое условие, теперь: NTR = левый потомок, TR = "1" Т.е. история повторяется... Т.к. в условиях 1 и 2 Repeat'а проверяется Name текущей вершины, а не левого/правого потомка... (или что-то другое, но не то что нужно) У тебя запутанные структуры... Тут сложно сориентироваться... Попробуй такое условие: if (T.LP[NTR].Next <> nil) and not(Prohod) and (T.Pred[T.LP[NTR].element.Num].Name<>'') then ... Аналогично для второго условия... Почему бы не сделать структуру дерева попроще, т.е. более понятную:
Корень дерева - нод, имеет два потомка (LP, RP), те в свою очередь то же имеют и т.д... Так проще было бы, имхо... Или у тебя какие-то дополнительные цели были при введении такой замудрёной системы ? -------------------- С уважением, г-н Посол. |
||||||
|
|||||||
| Zero |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: 8 Всего: 24 |
Извиняюсь, я забыл сказать, что обход дерева производится в порядке "LRT"(т.е. сначало просматривается левая вершина, потом правая и потом корень) Ответ на вопрос: 8_4_10_11_9_5_2_6_7_3_1 Да кстате, спасибо PoSoL, что помог мне разобратся, покрайней мере в том где была ошибка, но у меня почемуто досих пор не работает прога до конца, я конечно исправил некотрую часть кода, но гдето что-то осталось нетак...
Замечание: Посол кстати ты предложил ещё один вариант дерева, но как понему что-либо сделать, ведь там многие вещи (например информация о предках и т.п.) отсутствует, но если ты знаешь как по нему можно-было бы сделать чё-нибудь, то пришли Пример... Заранее спасибо!!! С уважением Zero |
||||
|
|||||
| p0s0l |
|
||||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Трудно тут разобраться, так что лучше сразу предложу вот что:
Вот пример:
MakeTree - создаёт дерево из текста FreeTree - освобождает дерево (память, занимаемую деревом) WalkTree - обходит дерево в порядке LRT Пример юзанья: занеси в Memo1 такой текст:
Первая строка - имя вершины-корня Далее идёт описание дерева: <имя вершины>:<левый потомок>,<правый потомок> PS: Имена - не обязательно цифровые Далее на кнопку повесь такое:
В результате будет то, что ты написал в качестве ответа... ИМХО, такая структура более понятна и с неё легче работать, особенно рекурсией... -------------------- С уважением, г-н Посол. |
||||||||
|
|||||||||
| Zero |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: 8 Всего: 24 |
Посол, извени что опять задаю тупые вопросы, но у меня функция PosEx, не работает, поэтому пока я разобрал смысл всего кода, то ...помоему там всё логично но хотелось бы всётаки его проверить...
Помоему как я понял функция PosEx определяет положение след. <Параметра1>, начиная с <Параметра3>, но за счёт того что ты использовал в процедуре Const s:string, то из этой сторки нельзя ничего удалять и соответственно чтобы нестандартно сделать функцию PosEx надо ещё не мало помучится, если ты знаешь как она сделана, то ни бог бы ты мне добавить этот код... Ещё раз спасибо, за беспокойства!!! Zero. |
|||
|
||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Забыл, извини! Ты правильно понял смысл PosEx, надо прописать в Uses модуль StrUtils:
А так, в следующий раз, если где-то найдёшь код с функцией, которой у тебя нет, наведи на неё курсор, нажми F1, и если выведется справка по этой функции - то это стандартная дельфовая функция, и там указан, какой Unit надо использовать (прописать в uses)...
-------------------- С уважением, г-н Посол. |
||||
|
|||||
| Zero |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: 8 Всего: 24 |
Вау, Клёво, Спасибо большое Посол!!! , ты даже не представляешь как ты мне помог!!!
Я уже несколько дней мучился с этой прого-й, а ты мне её круто упростил!!! |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
-------------------- С уважением, г-н Посол. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |