Структуры и алгоритмы обработки данных. Ключарев А.А - 36 стр.

UptoLike

36
ptrHead := ptrAddition;
end else begin {список не пуст}
{вставляем элемент списка справа от элемента,}
{на который указывает ptrCurrent}
ptrAddition^.Next := ptrCurrent^.Next;
ptrCurrent^.Next := ptrAddition;
ptrAddition^.Last := ptrCurrent;
ptrAddition^.Next^.Last := ptrAddition;
end;
ptrCurrent := ptrAddition;
end;
Порядок следования операторов присваивания процедуры очень ва-
жен. При неправильном переопределении указателей возможен разрыв
списка или потери указателя на первый элемент, что приводит к потере
доступа к части или всему списку.
Операция просмотра и операция поиска для циклического двунап-
равленного списка реализуются абсолютно аналогично соответствую-
щим процедурам для циклического однонаправленного списка, и при-
водить их не будем. Отметим только, что просматривать и искать здесь
можно в обоих направлениях.
Операция удаления элемента также осуществляется во многом ана-
логично удалению из циклического однонаправленного списка:
procedure Del_CicleDubleList(var ptrHead, ptrCurrent: PElement);
{Удаление элемента из циклического двунаправленного списка}
var
ptrAddition: PElement; {дополнительный указатель}
begin
if ptrCurrent <> nil then begin {входной параметр корректен}
if ptrHead^.Next <> ptrHead then begin
{Если удаляемый элемент, не единственный в списке}
ptrAddition := ptrCurrent^.Next;
ptrCurrent^.Last^.Next := ptrCurrent^.Next;
ptrCurrent^.Next^.Last := ptrCurrent^.Last;
if ptrHead = ptrCurrent then {удаляем первый}
ptrHead := ptrCurrent^.Next;
dispose(ptrCurrent);
ptrCurrent := ptrAddition;
end else begin
ptrHead:=nil;