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

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

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

 
 Ответить  Открыть новую тему 
> двоичное дерево, создание, вставка, печать, поиск, удален
andr
сообщение 31.10.2004 23:39
Сообщение #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 - 31.10.2004 23:41
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.11.2004 0:10
Сообщение #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 - 1.11.2004 0:36
 К началу страницы 
+ Ответить 
andr
сообщение 1.11.2004 0:37
Сообщение #3





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

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


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

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

Сообщение отредактировано: andr - 1.11.2004 0:39
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andr
сообщение 1.11.2004 0:42
Сообщение #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 - 1.11.2004 0:54
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Digitalator
сообщение 1.11.2004 21:20
Сообщение #5


Бывалый
***

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

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


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

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


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


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

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

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


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


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


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

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

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


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


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





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

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


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

Код

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


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

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


Гость






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


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

Сообщение отредактировано: APAL - 2.11.2004 21:27
 К началу страницы 
+ Ответить 
Digitalator
сообщение 3.11.2004 19:35
Сообщение #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 
 К началу страницы 
+ Ответить 
Altair
сообщение 4.11.2004 9:33
Сообщение #11


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

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

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


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

Ответил?

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


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





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

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


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

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

 



- Текстовая версия 22.06.2025 11:42
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"