Помощь - Поиск - Пользователи - Календарь
Полная версия: деревья
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-Екатерина-
 
TYPE
ND = ^ NODE;
NODE = RECORD
INF1 : INTEGER;
INF2 : STRING ;
LEFT : ND;
RIGHT : ND;
END;

VAR
ROOT,P,Q,T : ND;
ans: string

procedure create_root (var root:nd);
begin
clrscr;
root:=nil;
writeln ('koren dereva sozdan');
READLN;
END;


PROCEDURE INSERT_EL (P:ND; {адрес включаемого элемента} VAR ROOT:ND);

BEGIN
IF ROOT = NIL
THEN ROOT:= P {элемент стал корнем}
ELSE BEGIN { поиск по дереву }
T := ROOT;
Q := ROOT;
WHILE ( T <> NIL ) DO
BEGIN
IF P^.INF1 < T^.INF1
THEN BEGIN
Q := T;
{ запоминание текущего адреса}
T := T^.LEFT; {уход по левой ветви}
END
ELSE IF P^.INF1 > T^.INF1
THEN BEGIN
Q := T;
{ запоминание текущего адреса}
T := T^.RIGHT;
{уход по правой ветви}
END
ELSE BEGIN
WRITELN ('найден дубль включаемого элемента');
READLN;
EXIT; {завершение работы процедуры}
END
END;
end;
{после выхода из цикла в q - адрес элемента,
к которому должен быть подключен новый элемент}
IF P^.INF1 < Q^.INF1
THEN Q^.LEFT := P {подключение слева }
ELSE Q^.RIGHT := P; {подключение справа}
END;


procedure creat_tree (q: nd; VAR ROOT:ND); {v dialoge}

begin
root:=nil;
ans:='y';
while ans='y' do
begin
new(q);
WRITELN ('vvedite znachenie pervogo inf. polya ');
READLN ( Q^.INF1 );
WRITELN ('vvedite znachenie vtorogo inf. polya ');
READLN ( Q^.INF2 );
INSERT_EL(q,root);
root:=q;
writeln ('ewe yzel?? y-da');
readln (ans);
end;
end;

PROCEDURE obxod_OLP ( Q : ND ); {pryamoi}
BEGIN
clrscr;
IF Q <> NIL
THEN BEGIN
writeln (q^.inf1,'______________',q^.inf2);
obxod_OLP( Q^.LEFT );{уход по левой ветви-Л}
obxod_OLP( Q^.RIGHT );{уход по правой ветви-П}

END
else writeln ('derevo pystoe');
END;



ничего не выводит!! подскажите пожалуйста где ошибка!!
volvo
Что за привычка давать куски кода? ВЫЗОВ процедур где? Ты можешь написать все идеально, но при неправильном вызове ничего не будет работать!

Добавлено через 2 мин.
Кстати, заполнение дерева неправильно реализовано... Это должна быть рекурсивная процедура, а у тебя рекурсивного вызова нет...
nikita182
убери clrscr с процедуры obxod_OLP

ошибок много..
-Екатерина-
вот вызовы процедур!


procedure pr2_tree;
var fl4: boolean;
s: integer;
begin
fl4:=true;
while fl4=true do
begin
ved_tree(s);
case s of
1: create_root (root);
4: creat_tree(q,root);
5: begin
Q:= ROOT;
obxod_OLP(q);
end;
end;
end;
end;




а как создать рекурсивно, чтобы было в диалоге с пользователем??

Добавлено через 6 мин.
Цитата(nikita182 @ 19.05.2007 16:25) *


ошибок много..


описание вроде верно, создание пустого дерева тоже верно, вставка элемента вроде верно, сам обход правильный
или где не так??
подскажите где ошибки??
volvo
Обязательно велосипед изобрести? Я вот тут уже ТАК все разжевал, что дальше некуда:
Бинарные деревья
-Екатерина-
я все это видела!
можно тогда так переделать?? это правильно будет???


procedure Insert(var Root: TTree; X: T);
procedure CreateNode(var p: TTree; n: T);
begin
New(p);
WRITELN ('vvedite znachenie pervogo inf. polya ');
READLN ( p^.INF1 );
WRITELN ('vvedite znachenie vtorogo inf. polya ');
READLN ( p^.INF2 );
p^.Left := nil;
p^.Right := nil
end;

begin
if Root = nil Then CreateNode(Root, X) { создаем новый узел дерева }
else
if p^.inf1 < X then Insert(Right, X)
else
if p^.inf1 > X Then Insert(Left, X)
else writeln ('DUBL')!!!


end;



Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.