Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OTVET_OAIP.docx
Скачиваний:
22
Добавлен:
27.09.2019
Размер:
589.57 Кб
Скачать

11. Деки. Логическая структура дека.

Дек - особый вид очереди. Дек (от англ. deq - doubleendedqueue,т.е очередь с двумя концами) - это такой последовательный список, в котором как включение, так и исключение элементов может осуществляться с любого из двух концов списка. Частный случай дека - дек с ограниченным входом и дек с ограниченным выходом. Логическая и физическая структуры дека аналогичны логической и физической структуре кольцевой FIFO-очереди. Однако, применительно к деку целесообразно говорить не о начале и конце, а о левом и правом конце.

Операции над деком:

включение элемента справа;

включение элемента слева;

исключение элемента справа;

исключение элемента слева;

определение размера;

очистка;

12. Списки как динамические структуры данных. Виды линейных списков. Способы формирования односвязных списков. Оценка сложности.

Динамическая структура данных – множество переменных, связанных между собой указателями. Список представляет собой линейную последовательность переменных, каждая из которых связана указателями со своими соседями. Списки бывают следующих видов: 1) односвязные -каждый элемент списка имеет указатель на следующий;2) двусвязные - каждый элемент списка имеет указатель на следующий и на предыдущий элементы; 3) двусвязный циклический список - первый и последний элементы списка ссылаются друг на друга, таким образом цепочка представляет собой кольцо. Необходимо отметить основное свойство списков как структур данных. Последовательность обхода списка, естественно, зависит не от физического размещения элементов списка в памяти, а от последовательности из связывания указателями. Точно так же определяется нумерация элементов списка - логический номер элемента в списке - это номер, получаемый им в процессе движения по списку.

Способы формирования списков

Вариант 1. Элементы - обычные переменные, связи инициализируются транслятором, вся структура данных "зашита" в программный код

struct list

{ list *next;

int val;} a={0,NULL}, b={1,&a}, c={2,&b}, *ph = &c;

Вариант 2. Элементы списка создаются в обычном массиве, поэтому их количество ограничено. Связи устанавливаются динамически, то есть программой. Такой вариант используется, когда заданное количество элементов образуют несколько различных динамических структур, переходя из одной в другую. Примером является управление задачами в операционной системе, которые в процессе работы организуются в несколько различных очередей (списков):

struct list A[100],*ph; // Создать спис. из элем., размещ. в статическом массиве

for (i=0; i<99; i++)

{

A[i].next = A+i+1;

A[i].val = i;

}

A[99].next = NULL;

ph = A;

Вариант 3. Элементы списка являются динамическими переменными, связи между ними устанавливаются программно

list *InsertFirst(list *ph, int n)// Включить в начало списка ph - заголовок списка n - Значение элемента списка

{ list *pnew;

pnew = new list; // Создать элемент списка -

pnew->val = n; // динамическую переменную,

pnew->next = *ph; // заполнить его и

ph = pnew; // поместить в начало списка

return ph; // вернуть новый заголовок

}

Сложность добавления/удаления элемента - O( 1 ), т.к. не затрагивает остальные элементы контейнера. Сложность поиска - O( n ).

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