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

Так же, как и односвязный, двусвязный список может быть циклическим. Для двусвязного циклического списка отпадает необходимость хранения внешнего указателя на последний элемент списка, так как фактически он является элементом, расположенным слева от первого:

Над циклическим двусвязным списком могут быть выполнены все операции, определенные для циклического односвязного списка.

Класс tDCCircleListможет быть описан следующим образом:

type

tDCCircleList=class// класс - циклический двусвязный список

protected

fHead: pItem; // поле - указатель на начало списка

fSize:Word;// поле - число элементов списка

public

// Свойство - число элементов списка (доступ по чтению и записи)

property Size: Word read fSize write fSize;

// Свойство - указатель на начало списка (доступ по чтению и записи)

property Head: Word read fHead write fHead;

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

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

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

procedure InsertLeft(Addr: pItem; v: tValue);

// Исключение элемента справа от элемента с адресом Addr

function DeleteRight(Addr: pItem): tValue;

// Исключение из списка элемента с адресом Addr

function Delete(Addr: pItem): tValue;

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

procedureInsertHead(v:tValue);

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

procedure InsertRear(v: tValue);

function DeleteHead: tValue; // исключение из начала

functionDeleteRear:tValue;// исключение из конца

// Возвращение адреса элемента со значением v

function Search(v: tValue): pItem;

function Empty: Boolean; // возвращение true, если список пуст

procedureClear;// очистка списка

// Присоединение списка DCList2 справа

procedure Concat(var DCList2: tDCCircleList);

constructorCreate;// конструктор - создание пустого списка

destructor Destroy; override; // деструктор - удаление списка

end; // tDCCircleList

Класс tDCCircleListне является в данном описании наследником классаtDCListпо следующим причинам:

– поле RearклассаtDCListне используется;

– вводится новая процедура Concat;

– все методы класса tDCCircleListреализуются иначе, чем одноименные методы классаtDCList.

    1. Реализация основных операций над двусвязным циклическим списком

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

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

proceduretDCCircleList.InsertRear(v: tValue);

var

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

begin

NewItem:= New(pItem);

NewItem^.Value:= v;

ifEmpty

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

NewItem^.Left:= NewItem;

NewItem^.Right:= NewItem;

fHead:= NewItem; end

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

NewItem^.Left:= fHead^.Left;

NewItem^.Right:= fHead;

fHead^.Left^.Right:=NewItem;

fHead^.Left:=NewItem;

end;

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

end;// procedure tDCCircleList.InsertRear

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

proceduretDCCircleList.InsertHead(v: tValue);

begin

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

fHead:= fHead^.Left;

end; // procedure tDCCircleList.InsertHead

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

functiontDCCircleList.DeleteRear: tValue;

var

DisItem: pItem;

begin

DisItem:=fHead^.Left;// исключаемый элемент - последний

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

iffHead=DisItem

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

else begin

fHead^.Left:= DisItem^.Left;

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

end;

Dispose(DisItem);

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

end;// function tDCCircleList.DeleteRear

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

functiontDCCircleList.DeleteHead:tValue;

begin

fHead:= fHead^.Right;

DeleteHead:= DeleteRear;

end;// function tDCCircleList.DeleteHead

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]