IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> двоичное дерево, создание, вставка, печать, поиск, удален
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 7
Пол: Мужской

Репутация: -  0  +


мне надо сделать задачку с двочным деревом. выкладываю то, что сделал на данный момент, НЕ РАБОТАЮТ процедуры поиска и удаления. причина - не знаю. поиск выдает неправильный ответ, удаление даже не компилируется.

может быть кто-нибудь ошибку найдет?

Код

uses crt;

type u=^bintree;
    rec = record
      dist : string;
      num : string;
      name : string;
      date : string;
    end;
    bintree = record
      inf : rec;
      l, r : u;
    end;

var
 tree : u;
 fi, fo : text;

procedure ins(var tr : u; p : bintree); {работает}
begin
 if tr = nil then
 begin
   new(tr);
   tr^ := p;
 end
 else if p.inf.name < tr^.inf.name then
 ins(tr^.l,p) else
 ins(tr^.r,p);
end;

procedure insall; {работает}
var z : bintree;
begin
 while not seekeof(fi) do
 begin
   with z do begin
     readln (fi, inf.dist, inf.num, inf.name, inf.date);
     l := nil;
     r := nil;
     ins(tree, z);
   end;
 end;
end;

procedure printtree(t : u); {работает}
begin
 if t <> nil then
 begin
   printtree(t^.l);
   with t^.inf do
   begin
     writeln(fo, date, num, dist, name);
   end;
   printtree(t^.r);
 end;
end;

procedure findname(tree : u; x : string); {компилируется, но выдает неправ. ответ}
begin
 while tree <> nil do
 begin
   if x = tree^.inf.name then
   with tree^.inf do
   begin
     writeln(fo, date, num, dist, name);
   end else if x < tree^.inf.name then tree := tree^.l
                                  else tree := tree^.r;
 end;
 writeln(fo, 'not found')
end;

procedure delall(tree : u); {не компилируется}
begin
 if tree <> nil then
 begin
   delall(tree^.r);
   delall(tree^.r);
   dispose(tree);
   tree := nil;
 end;
end;

begin
 assign(fo, 'out.txt');
 rewrite(fo);
 assign(fi, 'in.txt');
 reset(fi);
 tree := nil;
 insall;
 printtree(tree);
 close(fo);
 close(fi);
end.


Сообщение отредактировано: andr -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






andr

Чем пробовали компилировать? У меня в ТР 7 все откомпилировалось на ура... Хотя
Код

procedure delall(tree : u);
begin
if tree <> nil then
begin
  delall(tree^.r);
  delall(tree^.r);
  dispose(tree);
  tree := nil;
end;
end;


я бы заменил на

Код

procedure delall(tree : u);
begin
if tree <> nil then
begin
  delall(tree^.r);
  delall(tree^.l); { Внимательно! }
  dispose(tree);
  tree := nil;
end;
end;


;)

Код

procedure findname(tree : u; x : string);
begin
while tree <> nil do
begin
  if x = tree^.inf.name then
  with tree^.inf do
  begin
    writeln(fo, date, num, dist, name);
    { !!!! Выходим !!!!! }
    Exit;
  end else if x < tree^.inf.name then tree := tree^.l
                                 else tree := tree^.r;
end;
writeln(fo, 'not found')
end;


Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 7
Пол: Мужской

Репутация: -  0  +


volvo, спасибо, я сам заметил, решил написать. но он в выходной файл пишет какие-то остатки от дерева, те заменяет некоторые символы. этого явно не должно быть. или у меня компилятор левый какой-то ???

p.s. как с поиском дела? smile.gif

Сообщение отредактировано: andr -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 7
Пол: Мужской

Репутация: -  0  +


volvo, я прямо за Вами не успеваю. smile.gif c выходом Вы, конечно, правы. какой-то я сегодня невнимательный. большое спасибо.

Код

procedure findname(tr : u; x : string);
begin
 while tr <> nil do
 begin
   if x = tr^.inf.name then
   begin
   with tr^.inf do
   begin
     writeln(fo, date, num, dist, name);
   end;
   exit;
   end else if x < tr^.inf.name then tr := tr^.l
                                  else tr := tr^.r;
 end;
 writeln(fo, 'not found')
end;


все равно пишет not found в любом случае.

Сообщение отредактировано: andr -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 247
Пол: Мужской

Репутация: -  1  +


А не лучше ли delall без рекурсии делать воизбежание многих могущих возникнуть неприятностей? <_<

Сообщение отредактировано: Digitalator -


--------------------
In byte we trust
ICQ World.ru
mail[dog]digitalator[dot]com
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Хм... если рекрсия хорошо реализованна, то не должно возникнуть проблемм.
Рекурсия хорошая вещь при правильной реализации.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Смотрю...
*****

Группа: Пользователи
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

Репутация: -  6  +


Ссылка действительно интересная.
Только читать ее будут единицы... даже если вырезать только самое важное.


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8





Группа: Пользователи
Сообщений: 7
Пол: Мужской

Репутация: -  0  +


я понял, в чем была проблема:

Код

readln (fi, inf.dist, inf.num, inf.name, inf.date);


т.к. все данные типа string, в dist записывалась вся строка, а остальные поля оставались пустыми. с integer такой вариант ввода заработал бы. на днях выложу все сделанное до конца. процедуры должны быть правильными.

Сообщение отредактировано: andr -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






... удалено...


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

Сообщение отредактировано: APAL -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Бывалый
***

Группа: Пользователи
Сообщений: 247
Пол: Мужской

Репутация: -  1  +


Цитата(Oleg_Z @ 2.11.04 16:03)
Хм... если рекрсия хорошо реализованна, то не должно возникнуть проблемм.
Рекурсия хорошая вещь при правильной реализации.

и чем же она хороша?

PS:
Спросите об этом мальчишку,
Что в доме напротив живет -
Он с рекурсией этой ложиться,
С рекурсией же он встает...
:D :D :D


--------------------
In byte we trust
ICQ World.ru
mail[dog]digitalator[dot]com
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


smile.gif
Рекурсия красива ... она доставляет огромное эстетическое наслаждение smile.gif
Цитата
и чем же она хороша?

Ответил?

А вот в Прологе например, это незаменимый инструмент!


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12





Группа: Пользователи
Сообщений: 7
Пол: Мужской

Репутация: -  0  +


вроде как отладил, если кому-то вдруг понадобится, оставьте свою почту, я пришлю.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.12.2024 21:22
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name