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

Тема 2. Односвязные и двусвязные линейные списки

  1. Линейный список

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

A

D

F

B

C

Начало

Число элементов списка не ограничено. Список, в котором нет ни одного элемента, называется пустым. Стеки, очереди и деки, рассмотренные в теме 1, являются частными случаями линейного списка, поскольку имеют ограниченную дисциплину обслуживания.

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

    1. Операции над линейным списком

Над линейным списком lмогут быть выполнены все операции, определенные для стека, очереди и дека (тема 1), а также следующие операции:

1) включение элемента со значением vв список после элемента с заданным адресомp–InsertAfter(l,p,v);

2) включение элемента со значением vв списокlперед элементом с заданным адресомp–InsertBefore(l,p,v);

3) исключение из списка lэлемента с адресомp–Delete(l,p);

4) исключение из списка lэлемента, следующего за элементом с адресомp–DeleteAfter(l,p);

5) поиск в списке lэлемента с заданным значениемv–Search(l,v) и возвращение его адреса.

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

Список, реализованный предложенным способом, называется односвязным линейным списком, т.к. каждый элемент этого списка содержит ссылку только на один соседний элемент. Описание класса tList:

type

tValue= Real;// тип значения элемента списка - вещественный

pItem= ^tItem; // тип указателя на элемент списка

tItem= record// тип элемента списка

Value: tValue; // содержательная часть элемента списка

Next : pItem; // указатель на следующий элемент списка

end; // record tItem

tList = class // класс - список

protected

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

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

public

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

property Head: pItem read fHead;

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

property Size: Word read fSize;

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

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

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

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

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

function DeleteAfter(Addr: pItem): tValue;

functionDelete(Addr:pItem):tValue;// исключение элемента с адресом Addr

// Поиск в списке элемента со значением v и возвращение его адреса

function Search(v: tValue): pItem;

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

procedureInsertHead(v:tValue);

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

procedure InsertRear(v: tValue);

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

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

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

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

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

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

end; // class tList