Запустив эту программу три раза, мы получим сообщение
Знакомство с заданием
Рассмотрим простейшее задание, связанное с добавлением элемента к динамической структуре-стеку: Dynamic3.
При ознакомительном запуске этого задания мы обнаружим новое обозначение в тексте, описывающем результирующий стек, а именно, точки, обрамляющие первый элемент стека:
Точки обозначают элементы динамической структуры, память для которых
Что произойдет, если динамическая структура будет создана с ошибками? Для того чтобы это выяснить, вернем в программе, решающей задание Dynamic3, указатель на прежнюю вершину стека, не добавляя к ней новый элемент:
uses PT4;
var
d: integer;
p1: PNode;
begin
Task('Dynamic3');
read(d, p1);
write(p1);
end.
После запуска данной программы окно задачника примет вид:
Скобки вокруг каждого элемента результирующего стека означают, что эти элементы созданы самим задачником, но
Для получения правильного решения задания Dynamic3 необходимо явно выделить память для нового элемента, используя процедуру New, и заполнить поля этого элемента, связав его с текущей вершиной стека (в результате сам этот элемент станет новой вершиной, адрес которой и следует вывести):
uses PT4;
var
d: integer;
p1, p2: PNode;
begin
Task('Dynamic3');
read(d, p1);
New(p2);
p2^.Data := D;
p2^.Next := p1;
write(p2);
end.
Приведем вид окна задачника при первом запуске этой программы:
Знакомство с заданием
Рассмотрим простейшее задание на удаление элемента из динамической структуры -- Dynamic5. В нем требуется удалить из стека вершину и вернуть указатель на новую вершину, то есть на элемент, расположенный непосредственно за удаленным.
Особенность заданий на удаление элементов из динамических структур заключается в том, что удаляемый элемент необходимо не только отсоединить" от исходной динамической структуры, но и полностью "уничтожить", то есть
Для того чтобы напомнить учащемуся о необходимости уничтожения некоторых элементов исходной динамической структуры, эти элементы выделяются на экране синим цветом меньшей яркости, чем обычные элементы (на рисунке таким способом выделен элемент 15):
Вначале приведем неправильный вариант решения, в котором не освобождается память, занимаемая удаленным из стека элементом:
uses PT4;
var p1: PNode;
begin
Task('Dynamic5');
read(p1);
write(p1^.Data, p1^.Next);
end.
Несмотря на то что все результирующие данные будут совпадать с контрольными (то есть текст в разделах Полученные результаты" и "Пример верного решения" будет одинаковым), на информационной панели появится сообщение об ошибке "
Для получения правильного решения достаточно добавить в конец программы оператор вызова процедуры Dispose, освобождающий память, на которую указывает указатель p1:
uses PT4;
var p1: PNode;
begin
Task('Dynamic5');
read(p1);
write(p1^.Data, p1^.Next);
Dispose(p1);
end.
Приведем вид окна задачника при первом запуске этой программы:
Знакомство с заданием
Особенности работы с двусвязными динамическими структурами рассмотрим на примере задания Dynamic30, в котором требуется преобразовать исходную односвязную структуру в двусвязную. Запустив программу-заготовку, созданную для этого задания, мы увидим в области исходных данных информацию об обычной" односвязной структуре, подобной рассмотренным в предыдущих примерах:
Динамическая структура, приведенная в разделе результатов, имеет две особенности: во-первых, ее элементы связаны символом =, а во-вторых, перед первым элементом присутствует текст nil<.