1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Привет всем! Подскажите пожалуйста что необходимо сделать, чтоб процедура поиска элемента в моем бинарном дереве работала??......Я смотрела 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.
Только вот возникла другая проблема...не могу поять в чём причина..вроде в процедруре 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;
Только вот возникла другая проблема...не могу поять в чём причина..вроде в процедруре 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;
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;
Если не сделаешь выход из процедуры - получишь ошибку при попытке обратиться по нулевому указателю...
Если не сделаешь выход из процедуры - получишь ошибку при попытке обратиться по нулевому указателю...
а я то об этом даже и не думала...спасибо за исправление... Но у меня есть ещё какие то проблемы в этой процедуре поиска...я же правильно пишу условия при которых писать "нет элемента" и ''есть элемент''??Если кто-нибудь увидит ошибку, то покажите где пожалста
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;
Ну, я только что пробовал. Все правильно пишет. Когда есть - пишет "est", когда нету - "net"... Ты какие данные вводишь? И что искать пытаешься? Давай, я с твоими данными попробую...
volvo, БоЛьШоЕ СпАсИбО за помощь. ...я во всем разобралась...всегда появлялся ответ "есть", потому что я указывала в readln имя не той переменной, что вводила..вот он и читал не то....когда исправила всё заработало..УРА!!УРА!!УРА!!