- •Глава 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.