
- •Глава 2. Информационные структуры
- •2.1. Линейные списки
- •2.2. Хранение линейных списков
- •2.3. Циклические списки
- •2.4. Массивы
- •2.4.1. Классификация и преобразование массивов
- •2.4.2. Адресация массивов
- •2.4.3. Представление разреженных матриц
- •2.5. Деревья
- •2.5.1. Исходные понятия
- •2.5.2. Бинарные деревья
- •2.5.3. Обход бинарных деревьев
- •2.6. Динамическое распределение памяти
Глава 2. Информационные структуры
2.1. Линейные списки
Линейный однонаправленный список — это совокупность данных одного типа (элементов списка, или узлов списка), связанных между собой отношением строгого порядка, определяющим следование элементов друг за другом. Требование упорядоченности обусловлено тем, что с каждым элементом линейного списка при хранении связан конкретный физический адрес, и задаётся правило перехода от очередного элемента к следующему.
Элемент
списка может иметь вторичную структуру,
состоящую из отдельных полей,
представляющих разные типы данных
(целые числа, вещественные числа, строки
символов, логические значения
«истина»/«ложь»«1» /«0» и т.д.). Такие списки часто называют
файлами.
Количество
элементов списка (его длина) задаётся
целым неотрицательным числом
(
означает, что список пуст). Элемент
списка, имеющий номер
,
будем обозначать
.
Операции с линейными списками. С линейными списками могут выполняться следующие операции (их следует отличать от операций над значениями элементов):
1.
Получение
доступа
к элементу
по известному номеру
.
Время доступа напрямую зависит от типа
памяти, в котором хранится список. Память
компьютера разделяется на:
- память с произвольным доступом (RAM);
- память с доступом только для чтения (ROM);
- внешнюю память для хранения больших объёмов информации;
- ассоциативную память (CAM), в которой доступ осуществляется не по адресу, а по содержанию (значению).
2.
Вставка
нового элемента
перед или после
.
3.
Удаление
элемента
.
4. Объединение списков с охранением порядка следования элементов (конкатенация).
5. Разбиение списка на части.
6. Дублирование списка.
7. Определение длины списка.
8.
Сортировка,
то есть изменение порядка следования
элементов в порядке возрастания значений
какого-либо поля (ключа),
входящего в структуру элементов списка.
Если ключ сортировки имеет численное
значение
,
то сортировка по убыванию
равносильна сортировке по возрастанию
:
(
).
Способ представления списков в памяти компьютера, как и тип памяти, выбираются с учётом тех из перечисленных выше операций, которые применяются наиболее часто.
Линейные списки с оконечным доступом. Линейные списки, в которых доступ к значению элемента, удаление и вставка элементов производятся на одном из концов, разделяются на следующие типы:
1. Стек — список, в котором операции доступа, вставки и удаления производятся только на одном фиксированном «верхнем» конце списка (рис. 1).
Рис. 1.
Дисциплина обслуживания стека описывается термином «последний пришёл – первый ушёл»; по-английски «last in – first out» (LIFO).
2. Односторонняя очередь, или просто очередь, — список, в котором вставка элементов выполняются на одном конце списка («постановка в очередь»), а доступ и удаление («после обслуживания») — на другом конце (рис. 2).
Удаление из
начала очереди
Добавление в конец очереди
Рис. 2.
Дисциплина обслуживания односторонней очереди описывается как «первый пришёл – первый ушёл»; по-английски «first in – first out» (FIFO).
3. Дек, или двусторонняя очередь, (double-ended queue) — список, в котором доступ, вставка и удаление могут выполняться на обоих концах списка. Дополнительно различают деки с ограниченным вводом и деки с ограниченным выводом, в которых указанная операция (в отличие от противоположной) может выполняться только на одном из концов (рис. 3).
Рис. 3.