read(d, p1);
New(p2);
p2^.Data := D;
p2^.Next := p1;
write(p2);
end.
Приведем вид окна задачника при первом запуске этой программы:
Пример 3. Удаление элемента из динамической структуры
Знакомство с заданием
Рассмотрим простейшее задание на удаление элемента из динамической структуры -- Dynamic5. В нем требуется удалить из стека вершину и вернуть указатель на новую вершину, то есть на элемент, расположенный непосредственно за удаленным.
Особенность заданий на удаление элементов из динамических структур заключается в том, что удаляемый элемент необходимо не только отсоединить" от исходной динамической структуры, но и полностью "уничтожить", то есть освободить память, занимаемую этим элементом .
Для того чтобы напомнить учащемуся о необходимости уничтожения некоторых элементов исходной динамической структуры, эти элементы выделяются на экране синим цветом меньшей яркости, чем обычные элементы (на рисунке таким способом выделен элемент 15):
Приступаем к решению
Вначале приведем неправильный вариант решения, в котором не освобождается память, занимаемая удаленным из стека элементом:
usesPT4;
varp1: PNode;
begin
Task('Dynamic5');
read(p1);
write(p1^.Data, p1^.Next);
end.
Несмотря на то что все результирующие данные будут совпадать с контрольными (то есть текст в разделах Полученные результаты" и "Пример верного решения" будет одинаковым), на информационной панели появится сообщение об ошибке " Не освобождена динамическая память ", а в разделе исходных данных будет выделен красным цветом тот элемент, который требовалось удалить:
Правильное решение
Для получения правильного решения достаточно добавить в конец программы оператор вызова процедуры Dispose, освобождающий память, на которую указывает указатель p1:
usesPT4;
varp1: PNode;
begin
Task('Dynamic5');
read(p1);
write(p1^.Data, p1^.Next);
Dispose(p1);
end.
Приведем вид окна задачника при первом запуске этой программы:
Пример 4. Двусвязные динамические структуры
Знакомство с заданием
Особенности работы с двусвязными динамическими структурами рассмотрим на примере задания Dynamic30, в котором требуется преобразовать исходную односвязную структуру в двусвязную. Запустив программу-заготовку, созданную для этого задания, мы увидим в области исходных данных информацию об обычной" односвязной структуре, подобной рассмотренным в предыдущих примерах:
Динамическая структура, приведенная в разделе результатов, имеет две особенности: во-первых, ее элементы связаны символом =, а во-вторых, перед первым элементом присутствует текст nil<.
Это означает, что результирующая структура является двусвязной , то есть каждый ее элемент связан не только с последующим элементом (с помощью поля Next, как в односвязной структуре), но и с предыдущим элементом (с помощью нового поля Prev), а поле Prev первого элемента имеет значение nil:
Приступаем к решению
Для преобразования исходной односвязной структуры в двусвязную необходимо задать правильные значения для полей Prev всех элементов структуры, перебирая в цикле пары соседних элементов:
usesPT4;
var
p1, p: PNode;
begin
Task('Dynamic30');
read(p1);
p := p1^.Next;
whilep <> nil do
begin
p^.Prev := p1;
p1 := p1^.Next;
p := p^.Next;
end;
write(p1); { вывод указателя на последний элемент }
Читать дальше