Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2_SAOD_-_Dinamicheskie_struktury_dannykh.doc
Скачиваний:
119
Добавлен:
21.03.2016
Размер:
1.66 Mб
Скачать
    1. Реализация основных операций над двусвязным списком

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

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

proceduretDCList.InsertRight(Addr: pItem; v: tValue);

var

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

begin

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

NewItem^.Value:=v;

ifEmpty

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

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

fHead:= NewItem; fRear:= NewItem; end

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

NewItem^.Left:= Addr;

NewItem^.Right:= Addr^.Right;

ifAddr=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), то расположенный слева от удаляемого элемент должен стать последним.

functiontDCList.Delete(Addr: pItem): tValue;

begin

Delete:= Addr^.Value;

ifAddr=fHead

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

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

if Addr=fRear

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

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

Dispose(Addr);

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

end;// function tDCList.Delete

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

functiontDCList.DeleteRight(Addr: pItem): tValue;

begin

ifAddr=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.