
- •Линейные списки
- •Стеки, очереди, деки
- •Представление стека в непрерывной памяти (в виде массива)
- •Представление стека в связанной памяти (в виде односвязного списка)
- •Очереди
- •Представление очереди в непрерывной памяти (в виде массива)
- •Представление очереди в связанной памяти (в виде односвязного списка)
- •Оценка затрат на поиск элемента
- •Деревья
- •Бинарные деревья
- •Сбалансированные и идеально сбалансированные деревья. Деревья поиска
15
ТЕМА. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ. ЛИНЕЙНЫЕ СПИСКИ ВОПРОСЫ 3,6, 2 (частично -стр.5)
Линейные списки
Линейный список - множество, состоящее изn>=0элементов (узлов), структура которого ограничивается их одномерным (линейным) относительным положением, определяемым свойствами:
если n>0,Node1- первый узел;
если 1<i<n,Nodei,i-му узлу предшествуетNodei-1, следуетNodei+1;
Noden- последний узел списка;
n=0- список пуст.
Для представления линейного списка можно использовать массив(в непрерывной памяти) или ссылочную структуру, называемуюсвязным списком(в связанной памяти).
ФОРМЫ ПРЕДСТАВЛЕНИЯ ЛИНЕЙНЫХ СПИСКОВ В ПАМЯТИ
В последовательной памяти(в виде массива):
рис.1. Список в последовательной памяти |
Const SIZE=10 List:array[1..SIZE] of Real; Var Top: 0..SIZE; |
для размещения списка выделяется сплошной участок памяти; его размер известен заранее и остается неизменным;
узлы списка располагаются в последовательных участках памяти, один узел следует сразу за другим;
для обозначения текущей длины спискатребуетсялибодополнительная переменная,либо специальное значениев последней или в следующей за ней ячейке памяти.
В связанной памяти (в виде связного списка):
рис.2. Список в связанной памяти |
Type List=^Node; Node=record info:real; // поле данных next:list; // поле-ссылка end; VAR HEAD:LIST; //адрес первого узла |
список представляет из себя набор записей, каждая из которых имеет, по крайней мере, одно поле данных и ссылку на следующий элемент (узел);
память под узлы списка выделяется при необходимости в теле программы;
используется переменная, задающаяадрес первого узла; другие элементы списка могут быть найдены с ее помощью при перемещении по ссылкам.
СРАВНЕНИЕ ФОРМ ПРЕДСТАВЛЕНИЯ (ЗАПОЛНИТЕ ПУСТЫЕ МЕСТА - РИСУНКИ ИЛИ КОД)
Связный список(-): дополнительное пространство для размещения связей.
Массив (-): состояниепереполнениявозникает чаще, чем в связных списках.
Доступ к k-му элементу:
Массив:
Заполните самостоятельно (рисунок и/или код)
Связный список:
Заполните самостоятельно (рисунок и/или код)
Вставка k-го узла:
Массив:
Заполните самостоятельно (рисунок и/или код)
Связный список:
Заполните самостоятельно (рисунок и/или код)
Удаление k-го узла:
Массив:
Заполните самостоятельно (рисунок и/или код)
Связный список:
Заполните самостоятельно (рисунок и/или код)
Связный список(+): проще организоватьобъединение/разбиение двух списков.
Заполните самостоятельно (рисунок и/или код)
Связный список (+): неявный выигрыш за счет частичного перекрытия совместно используемых областей памяти.
Заполните самостоятельно (рисунок и/или код)
Связный список (+): позволяет организовать более сложные структуры, чем линейные списки.
Заполните самостоятельно (рисунок и/или код)
Стеки, очереди, деки
Для стека/очереди – проще псевдокод, можно код для одного из представлений (для всех случаев- при наличии времени). Для дека ограничьтесь утверждением, что его можно представить как комбинацию стеков/очередей, а алгоритмы рассмотрены выше.
Выберем для линейного списка операции получения доступа, добавления и удаления i-го узла, разрешив их только на концах списка (i=1,i=n) и, в зависимости от допустимого набора операций, определим ряд списковых структур.
СТЕКИ
Более подробно см.: 519 П68 Прайс Д. Программирование на языке Паскаль.-М.:Мир,1987.
СТЕК(Stack,дисциплина обслуживания LIFO, Last-In-First-Out - "последним пришел – первым ушел")
Линейный список, в котором включение и исключение элементов (и обычно всякий доступ) выполняются только с одной его стороны, называемой вершиной стека.