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