ПРИМЕЧАНИЕ: перед выполнением операции удаления элемента или списка желательно запрашивать у пользователя подтверждение удаления.
Procedure Del_beg_list ( Var First : el);
Var
p : el;
answer : string;
Begin
If First <> Nil
then Begin { список не пуст }
writeln ('Вы хотите удалить первый элемент?(д/н) ');
readln ( answer );
if answer = 'д ' { многообразие ответов y, Y, д }
Then begin
p:=First;
If p^.Next = Nil
Then Begin
{в списке один элемент }
Dispose (p);
{уничтожение элемента}
First:=Nil;
{список стал пустым }
End
Else Begin
P := first;
{адрес удаляемого элемента }
First:=first^.Next;
{адрес нового первого элемента}
Dispose (p);
{удаление бывшего первого
элемента }
End;
End
End
Else writeln (' список пуст, удаление первого элемента невозможно');
End;
Удаление элемента из конца списка.
{ Нужен запрос и подтверждение удаления }
Кроме того, стоит извещать пользователя о том, что происходит
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;
В данном случае можно рекомендовать применение соответствующих процедур – «удаление из начала списка», «удаление из конца списка», «удаление из середины списка».
Удаление всего списка с освобождением памяти.
Procedure Delete_List ( Var First : el);
Var
P, q : el;
Answer : string;
Begin
If First <> Nil
Then Begin { список не пуст }
writeln ( ' Вы хотите удалить весь список ? (Y/N)' );
readln ( answer );
if answer = 'Y'
Then begin
q:=First;
p:=nil;
While ( q <> nil ) do
Begin
p:=q;
q:=q^.Next;
Dispose ( p ) ;
End;
First:=Nil;
{именно этот оператор и
обеспечивает уничтожение списка}
End;
End
Else writeln ('список пуст ');
End;
Можно ли вместо всех указанных действий выполнить только одно – first := nil; ?