РЕАЛИЗАЦИЯ ОСНОВНЫХ ОПЕРАЦИЙ НАД ДВУСВЯЗНЫМ ЦИКЛИЧЕСКИМ СПИСКОМ

В этом разделе рассмотрим только новые для двусвязного циклического списка операции, реализацию методов, одноименных с методами класса tDCList, предлагается выполнить самостоятельно.

Метод класса tDCCircleList, реализующий включение элемента в конец двусвязного циклического списка, имеет вид:

procedure tDCCircleList.lnsertRear(v: tValue);

// Включение элемента со значением v в конец списка

var

Newltem: pltem; //указатель на новый элемент

begin

Newltem:= New(pltem);

NewltemA.Value:= v;

if Empty

then begin //включение в пустой список

NewltemA.Left:= Newltem;

NewltemA.Right:= Newltem; fHead:= Newltem; end

else begin //включение в непустой список

NewltemA.Left:= fHeadA.Left;

NewltemA.Right:= fHead;

fHeadA.LeftA.Right:=Newltem;

fHeadA.Left:=Newltem;

end;

Inc(fSize); //увеличение числа элементов списка на 1

end; //procedure tDCCircleList.InsertRear

Включение элемента в начало двусвязного циклического списка. При реализации этой операции можно использовать следующий прием: включить элемент в конец, а затем перенести указатель fHead на стоящий слева от него включенный элемент.

procedure tDCCircleList.lnsertHead(v: tValue);

// Включение элемента со значением v в начало списка

begin

InsertRear(v); //включение элемента в конец

fHead:= fHeadA.Left;

end; //procedure tDCCircleList.lnsertHead

Исключение элемента из конца двусвязного циклического списка реализуется следующим образом:

function tDCCircleList.DeleteRear: tValue;

// Исключение элемента из конца списка и возвращение его значения

var

Disltem: pltem;

begin

Disltem:= fHeadMeft; // исключаемый элемент - последний

DeleteLast:= DisltemA.Value; //чтение последнего элемента списка

if fHead=Disltem

then fHead:=nil //исключается единственный элемент

else begin

// В списке больше одного элемента fHeadA.Left:= DisltemA.Left;

// последним становится предпоследний эл-т DisltemA.LeftA.Right:=fHead;

end;

Dispose(Disltem);

Dec(fSize); //уменьшение числа элементов на 1

end; //function tDCCircleList.DeleteRear

Исключение элемента из начала двусвязного циклического списка. При реализации этой операции сначала указатель первого элемента списка fHead передвигается на элемент, стоящий справа от него — бывший первый элемент (который и нужно исключить) становится последним. Его можно исключить из списка с использованием метода исключения из конца DeleteRear. Метод класса tCDCircleList, реализующий исключение элемента слева, имеет вид:

function tDCCircleList.DeleteHead: tValue;

// Исключение элемента из начала списка и возвращение его значения

begin

fHead:= fHeadA.Right;

DeleteHead:= DeleteRear;

end; //function tDCCircleList.DeleteHead

Операции исключения элементов из двусвязного списка DeleteHead и DeleteRear неприменимы к пустому списку, поэтому перед их выполнением необходимо анализировать значение признака «список пуст».

 
< Пред   СОДЕРЖАНИЕ     След >