Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
САОД Part 1.DOC
Скачиваний:
41
Добавлен:
02.11.2018
Размер:
1.68 Mб
Скачать
    1. Реализация основных операций над двусвязным списком

Включение элемента со значением v в двусвязный список справа от элемента с заданным адресом Addr выполняется по следующей схеме:

Реализация операции приведена ниже. Предполагается, что значение Addr отлично от nil и элемент с адресом Addr присутствует в списке. Если список пуст, то новый элемент включается в начало списка. При включении в конец списка указатель Rear передвигается на включённый элемент.

procedure tDCList.InsertRight(Addr: pItem; v: tValue);

var

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

begin

NewItem:= New(pItem); // выделение памяти под новый элемент списка

NewItem^.Value:= v;

if Empty

then begin // если список пуст, включаем в его начало

NewItem^.Left:= nil; NewItem^.Right:= nil;

fHead:= NewItem; fRear:= NewItem; end

else begin // список не пуст

NewItem^.Left:= Addr;

NewItem^.Right:= Addr^.Right;

if Addr=fRear

then fRear:= NewItem // если включение в конец списка

else Addr^.Right^.Left:= NewItem; // если включение в середину

Addr^.Right:= NewItem;

end;

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

end; // procedure tDCList.InsertRight

Включение элемента в двусвязный список слева от элемента с адресом Addr выполняется подобно включению справа, но все левые указатели заменяются правыми и наоборот, и вместо ситуации включения в конец списка анализируется ситуация включения в начало списка.

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

– если исключается элемент в начале списка (Addr=fHead), то расположенный справа от удаляемого элемент должен стать первым;

– если исключается элемент в конце списка (Addr=fRear), то расположенный слева от удаляемого элемент должен стать последним.

function tDCList.Delete(Addr: pItem): tValue;

begin

Delete:= Addr^.Value;

if Addr=fHead

then fHead:=Addr^.Right // исключается первый элемент

else Addr^.Left^.Right:=Addr^.Right; // исключается не первый элемент

if Addr=fRear

then fRear:=Addr^.Left // исключается последний элемент

else Addr^.Right^.Left:=Addr^.Left; // исключается не последний элемент

Dispose(Addr);

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

end; // function tDCList.Delete

Исключение из двусвязного списка элемента, расположенного справа от элемента с адресом Addr можно выполнить следующим образом: передвинуть указатель Addr на элемент, который необходимо удалить, и исключить его из списка с помощью операции Delete.

function tDCList.DeleteRight(Addr: pItem): tValue;

begin

if Addr=fRear

then WriteLn('Исключаемый элемент отсутствует')

else begin

Addr:= Addr^.Right; DeleteRight:= Delete(Addr);

end;

end; // function tDCList.DeleteRight

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

Операции исключения элементов из двусвязного списка DeleteRight и Delete неприменимы к пустому списку; при их реализации предполагается, что Addr<>nil, и элемент с заданным адресом присутствует в списке.

Поиск элемента с заданным значением v в двусвязном списке выполняется так же как и поиск элемента в односвязном списке с той разницей, что указатель Next в функции Search заменяется на Right.