Компонентный Паскаль/Связанный список: различия между версиями

Удаление элемента из списка опасно тем, что может разорвать цепочку, и если её не срастить -- указатель будет висеть в никуда.
<source lang="oberon2">
PROCEDURE (l: TDblList)Remove, NEW;
VAR
el, el1 : POINTER TO TDblElem;
BEGIN
IF l.len>1 THEN (* если списокв несписке пустойболее двух элементов *)
el:=l.end; (* найти последний элемент *)
el1:=el.backward;(* найти предпослденийпредпоследений элемент *)
el:=NIL; (* последний элемент удалить *)
l.end:=el1; (* последним сделать предпоследний *)
el1.forward:=NIL; (* больше никуда не показывает *)
DEC(l.len); (* уменьшить длину *)
el1.last:=TRUE; (* выставить правильный флаг *)
ELSE (* остался последний элемент *)
DEC(l.len); (* уменьшить длину *)
el:=l.end;
ELSE (* остался последний элемент *)
el:=NIL;
el:=l.end:=NIL;
l.first el:=NIL;
l.lenend:=0NIL;
el l.first:=NIL;
END;
INC( l.len):=0;
END Remove;
INC(l.len);
END Remove;
</source>
 
788

правок