
- •Динамическая память.
- •Указатель.
- •Стандартные процедуры размещения и освобождения динамической памяти.
- •1. С помощью стандартной процедуры New:
- •2. С помощью стандартной процедуры GetMem.
- •С помощью стандартной процедуры Dispose
- •С помощью стандартной процедуры fRееМеm.
- •Стандартные функции обработки динамической памяти.
- •Примеры и задачи.
- •Организация списков.
- •Задачи включения элемента в линейный однонаправленный список без головного элемента.
- •Формирование пустого списка.
- •Формирование очередного элемента списка.
- •Подсчет числа элементов списка.
- •Вставка элемента в начало списка.
- •Включение элемента в конец списка.
- •Включение в середину (после I-ого элемента).
- •1.1Задачи на удаление элементов из линейного однонаправленного списка без головного элемента.
- •Удаление элемента из начала списка.
- •Удаление элемента из конца списка.
- •Удаление элемента из середины списка (в данном случае I-ого элемента).
- •Удаление всего списка с освобождением памяти.
- •Задачи на замену элементов в линейном однонаправленном списке без головного элемента.
- •Стеки, деки, очереди.
- •Использование рекурсии при работе со списками.
Удаление элемента из конца списка.
{ Нужен запрос и подтверждение удаления }
Кроме того, стоит извещать пользователя о том, что происходит
Procedure Del_end_list( Var First :el);
Begin
If First < > Nil
then Begin {список не пуст}
if fiRst^.next = nil
then begin
{в списке - единственный элемент }
p := first;
dispose (p);
First := nil;
End
Else begin
{в списке больше одного элемента }
Q := First;
T := First;
{цикл поиска адреса
последнего элемента}
While q^.Next < > Nil do
Begin
T := q;
{запоминание адреса текущего элемента}
q:=q^.Next;
{переход к следующему элементу}
end;
{после окончания цикла
Т - адрес предпоследнего,
а Q - адрес последнего элемента списка}
dispose (q); {удаление последнего элемента}
t^.next := nil;
{предпоследний элемент стал последним}
end
end
else writeln ('список пуст, удаление элемента невозможно ');
end;
Можно перед удалением предъявить пользователю содержание удаляемого элемента и запросить подтверждение удаления («…действительно ли вы хотите удалить…»). Это будет полезно и в процессе работы программы, и особенно при отладке.
ПРИМЕЧАНИЕ. Если этого требует алгоритм обработки данных, то после исключения элемента из списка этот элемент может не удаляться из памяти, а может быть передан на какую-либо обработку через список параметров.
Удаление элемента из середины списка (в данном случае I-ого элемента).
Procedure Del_I_elem ( var first : el; i : integer);
Var
t, q, r : el;
K ,n : integer;
Begin
n := count_el(first); {определение числа элементов списка}
if (i < 1 ) or ( i > n )
then begin
writeln ('i задано некорректно');
exit;
end
else begin
{нужно добавить подтверждение удаления }
if i = 1
then begin {удаляется 1 элемент}
t := first;
first:= first^.next;
dispose ( t);
{ имеет ли значение
порядок выполнения операторов ?
( de jure и de facto) }
end
else if i = n
then begin
{ см. случай удаления
последнего элемента}
. . .
end
else begin{удаление из «середины» списка}
t := first;
q := nil;
k := 1;
while ( k < i ) do
begin
{поиск адресов (i-1)-го и
i-го элементов}
k := k + 1;
q := t;
t := t^.next;
end;
r := t^.next;
{ найдены адреса
i-го (T), (i-1)-го (Q) и
(i+1)-го (R) элементов }
q^.next := r;
dispose ( t );
{ удален i-ый элемент }
end;
end;
end;
В данном случае можно рекомендовать применение соответствующих процедур – «удаление из начала списка», «удаление из конца списка», «удаление из середины списка».