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

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

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

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

A

D

F

B

C

Начало

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

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

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

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

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

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

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

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

5) поиск в списке l элемента с заданным значением vSearch(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;

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

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

function Search(v: tValue): pItem;

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

procedure InsertHead(v: tValue);

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

procedure InsertRear(v: tValue);

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

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

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

procedure Clear; // очистка списка

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

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

end; // class tList