1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
В общем задача заключается в том что надо из текстового файла заполнить дек и взять последние "Б" элементов и записать их в стек.Суть вопроса заключается в том какую реализацию выбрать.первый скособ это создать процедуру котора берет элемент из дека и пишет в стек,а вторая уже выполняет первую до выполнения условия(достижение Б),либо сделать лиш одну процедуру,которая делает все сразу.
тобиш по суди дожно выводится boris kor bob ksenia rita bob maria
Значит, так. Дерево создается неправильно, пересматривай алгоритм создания. Это минус. Плюс - в том, что оно-таки создается, и все итемы, прочитанные из файла в него попадают и благополучно выводятся на печать. Что я поменял (относительно программы из поста №18):
{ 1 - реализацию CreateNode } Procedure CreateNode(temp : PTree; var root:PTree); Begin new(root); { !!! вот только в этом месте выделяем память под элемент !!! }
{ 2 - процедура печати дерева теперь такая: } procedure printKLP(root:PTree);
procedure print(level: integer; root:PTree); begin if root<>NIL then begin writeln('':2*level, root^.head.name); print(level+1, root^.left); print(level+1, root^.right); end; end;
begin clrscr; if (root=NIL) then writeln('Дерево пусто!') else Print(0, root);
writeln; writeln('Нажмите любую клавишу для выхода в главное меню'); end;
{ 3 - ну, и само создание дерева: } Procedure CreateTree(var root: PTree; var fin : text); var temp : PTree; begin while not eof(fin) do begin new(temp); { <--- Временное хранилище: создали ... } readfile(fin,temp^.head.stat); { читаем stat } readfile(fin,temp^.head.name); { читаем имя } read(fin,temp^.head.data); { читаем дату рождения } readln(fin); { все остальное - пропускаем !!! } AddItem(root,temp); { и добавляем прочитанное в дерево } dispose(temp); { <--- Временное хранилище: удалили} end; end;
Хотя я бы процедуру CreateTree и AddItem переписал. Зачем создавать и удалять временный буфер, если можно прочесть данные в строки и число, и передавать их в AddItem... Хотя с другой стороны, тогда придется тянуть все параметры по многим подпрограммам, можешь оставить как есть...
Теперь о твоем многострадальном Деке + Стеке. Оно работает, выдает корректный результат. Все было бы хорошо, если бы не утечки памяти. Ты не чистишь память за собой, это плохо, и преподаватели (хорошие преподаватели) знают, как это проверяется. А для себя - это еще хуже. Привыкаешь работать, "не убирая мусор" за собой - потом при программировании под Win получаешь на пустом, казалось бы, месте ошибки типа "не хватает памяти для ресурсов", или что-нибудь в таком роде. А памяти-то гигабайты. И все равно, все очень быстро забрасывается мусором. Привыкай прямо сейчас: память выделил - значит надо вернуть.