var
p1: PNode;
n: integer;
begin
Task('Dynamic2');
read(p1);
n := 0;
whilep1 <> nil do
begin
write(p1^.Data);
n := n + 1;
p1 := p1^.Next;
end;
write(n);
end.
После запуска программы можно убедиться, что все числовые результирующие данные найдены правильно, однако из-за того, что не выведен указатель на последний элемент, решение признано ошибочным с диагностикой Выведены не все результирующие данны е ":
Добавим в конец программы оператор
write(p1);
После запуска нового варианта программы все требуемые данные будут выведены, однако результирующее значение указателя будет равно nil. Это связано с тем, что после завершения цикла whileв переменной p1 содержится нулевой указатель , а не указатель на последний элемент динамической структуры:
Правильное решение
Для того чтобы получить правильное решение, опишем вспомогательную переменную p2, в которой будем сохранять адрес элемента, предшествующего элементу с адресом p1. После завершения цикла whileв этой переменной будет храниться адрес последнего элемента динамической структуры:
usesPT4;
var
p1,p2: PNode;
n: integer;
begin
Task('Dynamic2');
read(p1);
n := 0;
whilep1 <> nil do
begin
write(p1^.Data);
n := n + 1;
p2 := p1; { сохраняем адрес текущего элемента }
p1 := p1^.Next; { и переходим к следующему элементу }
end;
write(n, p2);
end.
Запустив эту программу три раза, мы получим сообщение Задание выполнено ! ":
Пример 2. Добавление элемента к динамической структуре
Знакомство с заданием
Рассмотрим простейшее задание, связанное с добавлением элемента к динамической структуре-стеку: Dynamic3.
При ознакомительном запуске этого задания мы обнаружим новое обозначение в тексте, описывающем результирующий стек, а именно, точки, обрамляющие первый элемент стека:
Точки обозначают элементы динамической структуры, память для которых должна быть выделена программой учащегося (в отличие от тех элементов, которые размещаются в памяти самим задачником).
Приступаем к решению
Что произойдет, если динамическая структура будет создана с ошибками? Для того чтобы это выяснить, вернем в программе, решающей задание Dynamic3, указатель на прежнюю вершину стека, не добавляя к ней новый элемент:
usesPT4;
var
d: integer;
p1: PNode;
begin
Task('Dynamic3');
read(d, p1);
write(p1);
end.
После запуска данной программы окно задачника примет вид:
Скобки вокруг каждого элемента результирующего стека означают, что эти элементы созданы самим задачником, но располагаются не на тех позициях, на которых они должны находиться при правильном решении . Действительно, тот элемент, который в решении является первым, должен (после добавления нового элемента) оказаться вторым и т. д. Итак, наличие скобок в тексте результирующей динамической структуры означает, что ее элементы располагаются не в том порядке, который требуется.
Правильное решение
Для получения правильного решения задания Dynamic3 необходимо явно выделить память для нового элемента, используя процедуру New, и заполнить поля этого элемента, связав его с текущей вершиной стека (в результате сам этот элемент станет новой вершиной, адрес которой и следует вывести):
usesPT4;
var
d: integer;
p1, p2: PNode;
begin
Task('Dynamic3');
Читать дальше