Помогите пожалуйста. Все процедуры для огранизации дерева работают. Единственное никак не получается сохранить записи в файл и при повторном запуске их прочитать.
Если заполнение дерева и его просмотр действительно работают правильно, то добавь вот это:
procedure savetree(fn: string; top: treeprt);
var
f: fileof data;
procedure print(t: treeprt);
beginif t<>nilthenbegin
print(t^.left);
write(f, t^.inf);
print(t^.right);
end;
end;
begin
assign(f, fn);
rewrite(f);
print(top);
close(f);
end;
procedure loadtree(fn: string; var top: treeprt);
var
f: fileof data;
R: data;
begin
assign(f, fn);
reset(f);
top := nil;
whilenot eof(f) dobegin
read(f, R);
top := addtree(top, R);
end;
close(f);
end;
, и вызывай там, где надо сохранить дерево в файл savetree(имя_файла, корень_дерева), а там, где надо восстановить - loadtree(имя_файла, будущий_корень_дерева)...
ALma
15.02.2009 23:02
Исправила, как подсказали, но все равно не работает
"Не работает" - это не ошибка... Я не знаю, работало ли все правильно ДО того, как внесены исправления. Какие данные вводились?
И потом, я не предлагал ТАК... Я предлагал передавать имя файла, а не саму файловую переменную описывать глобально и тягать ее туда-сюда... Не надо ПЕРЕДЕЛЫВАТЬ, а потом предъявлять претензии...
ALma
16.02.2009 1:33
Претензий на самом деле нет никаких. Если я неправильно поняла, это только моя ошибка. Но дело не в этом. Задание такое, программа должна создавать дерево в файле и создавать его заново при повторном запуске. Только в этом вопрос. Я допускаю, что в моем варианте проги данные сохраняются в файле, но вот считать их оттуда не получается
volvo
16.02.2009 2:03
Ну, смотри: сами процедуры я написал выше... Без изменений добавь их в свою программу. А вызывать - так:
beginrepeat
ClrScr;
writeln('1 - cozdanie dereva');
writeln('2 - dobavlenie lista');
writeln('3 - pods4et koli4estva vepshin');
writeln('4 - prosmotr dereva');
writeln('5 - save_tree');
writeln('6 - load_tree');
writeln('7 - vihod');
writeln('______________________');
writeln( 'vvedite punkt menu');
readln(key);
case key of{ Тут все пункты, от 1-го до 4-го }5: savetree('tree.dat', top); { <--- Можешь поменять путь к файлу }6: begin
top := nil;
loadtree('tree.dat', top); { <--- Здесь - тот же путь, что и выше... Я бы оформил его константой }end;
end{ case }until key = 7;
end.
Только что проверил... После сохранения дерева в файл и перезапуска программы дерево успешно считывается...
ALma
16.02.2009 2:15
Да, работает, спасибо огромное.
TheKnyazz
24.02.2009 13:35
У меня вот затесался вопросик. Учитывая, что в данном случае мы сохраняем бинарное дерево слева направо, то оно при данном считывания вырождается в линейный список. Следовательно, как я понял, чтоб структура сохранялась процедура сохранения должна выглядеть, как идущая сверху вниз.
procedure savetree(top:treeprt; var tab: derevo);
var
f: derevo;
procedure print(top: treeprt);
begin
write(f, t^.data);
if t^.left<>nilthen print(t^.left);
if t^.right<>nilthen print(t^.right);
end;
begin
assign(tab, 'D:\spisok.txt' );
assign(f,'D:\Lab10');
rewrite(f);
print(top);
close(f);
end;
procedure loadtree(var tab: derevo; top: treeprt);
var
f: derevo;
R: data;
begin
assign(tab, 'D:\spisok.txt' );
assign(f,'D:\Lab10');
reset(f);
top := nil;
whilenot eof(f) dobegin
read(f, R);
top := addtree(top, R);
end;
close(f);
end;
Очень интересно узнать, а можно ли после записи слева направо восстановить структуру дерева?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.