Привет всем! Подскажите пожалуйста что необходимо сделать, чтоб процедура поиска элемента в моем бинарном дереве работала??......Я смотрела 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 вызвать, ну, а во-вторых, при распечатке дерева ты просто теряешь указатель на корень
procedure vyvod(r: pspisok); { <-- Без Var }
DiSkEtKa
23.05.2006 17:52
Цитата
Во-первых, тебе надо все-таки Poisk вызвать,
Ой..........точно.......
Только вот возникла другая проблема...не могу поять в чём причина..вроде в процедруре Poisk я сделала всё так....а она неправильно работает..еслии я ввожу эелемент, котрого в дереве нет,эта процедура всё равно выводит, что такой элемент есть...
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 вызвать,
Ой..........точно.......
Только вот возникла другая проблема...не могу поять в чём причина..вроде в процедруре Poisk я сделала всё так....а она неправильно работает..еслии я ввожу эелемент, котрого в дереве нет,эта процедура всё равно выводит, что такой элемент есть...
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
У меня вон чего выдает: (просто поменял сообщения на английские, ибо с кириллицей проблема )
volvo, БоЛьШоЕ СпАсИбО за помощь. ...я во всем разобралась...всегда появлялся ответ "есть", потому что я указывала в readln имя не той переменной, что вводила..вот он и читал не то....когда исправила всё заработало..УРА!!УРА!!УРА!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.