Предположим, что нам требуется удалить из очереди минимальный элемент. Тогда в частном случае может быть удален один из крайних или промежуточный элемент. При удалении крайних элементов должен быть обеспечен соответствующий перенос указателя L или указателя R. Как и в стеке, для удаления заданного элемента из очереди необходимо знать адрес предыдущего элемента.
Program DelMinElem;
Type PoinType = ^DynType;
DynType = record
Inf : integer;
Next : PoinType;
end;
Var L, { указатели левого и правого }
R, { концов очереди }
Run, { текущий указатель }
Pmin : PoinType; { указатель элемента, предшествующего }
{ минимальному элементу очереди }
InfMin : integer; { значение минимального элемента }
F : text;
Begin
Формирование очереди
If L<>nil then
Begin
InfMin:=L^.Inf; Pmin:=L;
Run:=L;
While Run^.Next<>nil do
Begin
If Run^.Next^.Inf<InfMin then
Begin
InfMin:=Run^.Next^.Inf; Pmin:=Run;
End;
Run:=Run^.Next;
End;
IfInfMin=L^.Inf then{ удаление первого элемента }
Begin { с переносом указателя L }
L:=L^.Next; Dispose(Pmin);
End
Else
Begin
If Pmin^.Next=R then{ перенос R при удалении }
R:=Pmin; { последнего элемента }
Run:=Pmin^.Next; { удаление произвольного}
Pmin^.Next:=Pmin^.Next^.Next;{ элемента (в том }
Dispose(Run); { числе последнего) }
End;
End;
Печать очереди
End.
Если минимальным является первый или второй элементы очереди, то в обоих случаях Pmin = L. Поэтому для указания о том, является ли первый элемент минимальным, в программе производится проверка InfMin = L^.Inf.