Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Поиск по дереву...

Автор: DiSkEtKa 23.05.2006 13:31

Привет всем! Подскажите пожалуйста что необходимо сделать, чтоб процедура поиска элемента в моем бинарном дереве работала??......Я смотрела FAQ....но не разобралась.....до конца..

uses crt;
type pspisok=^derevo;
derevo=record
i:string;
nextL:pspisok;
nextR:pspisok;
end;
var r,r1:pspisok;
a:string;
c:char;
procedure dobavl(var r,r1:pspisok);
begin
if r=nil then r:=r1
else if r1^.i>r^.i then dobavl(r^.nextR,r1)
else dobavl(r^.nextL,r1)
end;
procedure vyvod(var r:pspisok);
begin
if r<>nil then
begin
vyvod(r^.nextL);
writeln(r^.i);
vyvod(r^.nextR)
end
end;
procedure poisk(var r:pspisok;a:string);
var y:boolean;
begin
if r=nil then writeln('net');
if r^.i=a then writeln('est')
else if a>r^.i then poisk(r^.nextR,a)
else poisk(r^.nextL,a);
end;
begin
clrscr;
r:=nil;
c:='y';
while c='y' do
begin
writeln('Введите элемент');
readln(a);
new(r1);
r1^.i:=a;
r1^.nextL:=nil;
r1^.nextR:=nil;
dobavl(r,r1);
writeln('Продолжить ввод? y/n');
readln( c );
end;
writeln('Дерево:');
vyvod( r );
readkey;
end.

Автор: volvo 23.05.2006 13:51

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

procedure vyvod(r: pspisok); { <-- Без Var }

Автор: DiSkEtKa 23.05.2006 17:52

Цитата
Во-первых, тебе надо все-таки Poisk вызвать,

Ой..........точно....... yes2.gif

Только вот возникла другая проблема...не могу поять в чём причина..вроде в процедруре Poisk я сделала всё так....а она неправильно работает..еслии я ввожу эелемент, котрого в дереве нет,эта процедура всё равно выводит, что такой элемент есть... unsure.gif

procedure poisk(var r:pspisok;a:string);
var y:boolean;
begin
if r=nil then writeln('net');
if r^.i=a then writeln('est')
else if a>r^.i then poisk(r^.nextR,a)
else poisk(r^.nextL,a);
end;

Автор: DiSkEtKa 23.05.2006 17:52

Цитата
Во-первых, тебе надо все-таки Poisk вызвать,

Ой..........точно....... yes2.gif

Только вот возникла другая проблема...не могу поять в чём причина..вроде в процедруре Poisk я сделала всё так....а она неправильно работает..еслии я ввожу эелемент, котрого в дереве нет,эта процедура всё равно выводит, что такой элемент есть... unsure.gif

procedure poisk(var r:pspisok;a:string);
var y:boolean;
begin
if r=nil then writeln('net');
if r^.i=a then writeln('est')
else if a>r^.i then poisk(r^.nextR,a)
else poisk(r^.nextL,a);
end;

Автор: volvo 23.05.2006 18:03

procedure poisk(r:pspisok; a:string);
var y:boolean;
begin
if r = nil then begin
writeln('net');
exit; { <--- Не забывай выходить из процедуры !!! }
end;

if r^.i = a then writeln('est')
else
if a > r^.i then poisk(r^.nextR, a)
else poisk(r^.nextL, a);
end;

Если не сделаешь выход из процедуры - получишь ошибку при попытке обратиться по нулевому указателю...

Автор: DiSkEtKa 23.05.2006 18:18

Цитата
Если не сделаешь выход из процедуры - получишь ошибку при попытке обратиться по нулевому указателю...

а я то об этом даже и не думала...спасибо за исправление...
Но у меня есть ещё какие то проблемы в этой процедуре поиска...я же правильно пишу условия при которых писать "нет элемента" и ''есть элемент''??Если кто-нибудь увидит ошибку, то покажите где пожалста

procedure poisk(r:pspisok; a:string);
var y:boolean;
begin
if r = nil then begin
writeln('net');
exit;
end;
if r^.i = a then writeln('est')
else
if a > r^.i then poisk(r^.nextR, a)
else poisk(r^.nextL, a);
end;

Автор: volvo 23.05.2006 18:21

Ну, я только что пробовал. Все правильно пишет. Когда есть - пишет "est", когда нету - "net"... Ты какие данные вводишь? И что искать пытаешься? Давай, я с твоими данными попробую...

Автор: DiSkEtKa 23.05.2006 18:38

Вообщем я ввожу несколько элементов: 1,4,5,8......элемент для поиска: девятка....её же нет в дереве..а мне выдает, что есть....

Автор: volvo 23.05.2006 19:05

blink.gif У меня вон чего выдает:
(просто поменял сообщения на английские, ибо с кириллицей проблема rolleyes.gif )

Прикрепленное изображение

Вызываю поиск так:

vyvod( R );
poisk( R, '9' );
vyvod( R );

Автор: DiSkEtKa 23.05.2006 19:43

volvo, БоЛьШоЕ СпАсИбО за помощь. give_rose.gif ...я во всем разобралась...всегда появлялся ответ "есть", потому что я указывала в readln имя не той переменной, что вводила..вот он и читал не то....когда исправила всё заработало..УРА!!УРА!!УРА!! cool.gif good.gif