- •А.Н. Горитов
- •Учебное пособие
- •Учебное пособие
- •Введение
- •1 Введение в предмет
- •1.1 Непрерывная и дискретная информация
- •1.2 Данные и эвм
- •1.3 Объекты предметной области
- •1.4 Представление информации об объектах
- •1.5 Абстрактные алфавиты. Кодирование
- •2 Основные типы и структуры данных эвм
- •2.1 Архитектурные особенности эвм, наиболее существенные для представления данных
- •2.2 Основные понятия о типах и структурах данных
- •2.3 Массивы
- •2.4 Строки
- •2.5 Записи
- •2.6 Записи с вариантами
- •2.7 Множества
- •3 Последовательный файл
- •3.1 Основные свойства последовательных файлов
- •3.2 Сортировка последовательных файлов
- •4 Полустатические структуры
- •4.1 Стек, очередь и дек как полустатические структуры
- •4.2 Представление полустатических структур с помощью массивов
- •5 Линейные динамические структуры
- •5.1 Основные свойства динамических структур
- •5.2 Реализация связного списка массивом
- •5.3 Кольцевой связный список
- •5.4 Линейный двусвязный список
- •6 Представление динамических структур с помощью указателей
- •6.1 Указатели
- •6.2 Представление стека
- •6.3 Представление очереди
- •6.4 Ведение динамических списков с помощью указателей
- •6.5 Алгоритм составления кольцевого двусвязного списка
- •7 Древовидные структуры данных
- •7.1 Основные понятия и определения
- •7.2 Представление деревьев в эвм
- •7.3 Основные операции с бинарными деревьями
- •7.4 Сильно ветвящиеся деревья
- •8 Алгоритмы на графах
- •8.1 Машинное представление графов
- •8.2 Поиск в глубину в графе
- •8.3 Поиск в ширину в графе
- •8.4 Стягивающие деревья (каркасы)
- •8.5 Отыскание фундаментального множества циклов в графе
- •8.6 Эйлеровы пути в графе
- •8.7 Алгоритмы с возвратом
- •8.8 Нахождение кратчайших путей в графе
- •8.9 Кратчайшие пути от фиксированной вершины
- •8.10 Алгоритм Дейкстры
- •8.11 Пути в бесконтурном графе
- •Литература
6.3 Представление очереди
b
^-ЕТЗ г(
R
^К
|=В1 I I
I
Nil Nil
Рис. 16 Представление очереди в виде линейного списка
Указатель F должен указывать на первый элемент очереди, а R - на последний. Указатель последнего элемента очереди должен быть равен NIL (рис. 16). Таким образом для работы с очередью нужны три переменных типа "указатель". Тогда описание:
TYPE ТР = ASP;
SP = RECORD INF : CHAR; LINK : TP
END;
VAR F, K, R : TP; CH : CHAR;
В таком представлении с точки зрения удаления очередь подобна стеку, а с точки зрения добавления - это как бы понижение нижней границы стека.
Операция удаления из очереди полностью эквивалентна операции удаления из стека по указателю F.
K := F;
F := KMJNK;
СН := KMNF;
DISPOSE(K);
Операция добавления в очередь - это добавление после элемента, на который указывает R: NEW (К); - память для нового элемента
KMNF := СН; - информация в новый элемент
KMJNK := NIL; - занести указатель, т.к. этот элемент послед ний RELINK := К; - связь с последним элементом
R := К; - указатель на последний элемент
При работе с динамической очередью снимается проблема переполнения очереди.
Проверка на пустую очередь осуществляется сравнением F с NIL.
6.4 Ведение динамических списков с помощью указателей
Динамические списки легко ведутся, если в качестве ссылок использовать переменные типа "указатель". В этом случае снимается проблема переполнения, т.к. теоретически память ЭВМ можно считать неограниченной.
Кроме того, указатели дают возможность повторного использования свободной памяти не только для одного списка, но и для нескольких.
Опишем односвязный список.
TYPE ТР = ASP; SP = RECORD
INF : CHAR; { INF : T0 }
LINK : TP END;
VAR NACH, I, J, К : TP С : CHAR;
Обратите внимание: переменной типа SP нет!
Основные операции со списками.
Переход к следующему элементу.
Пусть I - указатель на текущий элемент списка. Тогда
J := IA.LINK; - указывает на следующий элемент списка.
Поиск нужного элемента с начала списка.
Пусть хотим найти элемент со значением 'А'.
I := NACH;
WHILE (С <> 'A') AND (I <> NIL) DO BEGIN С := IMNF; I := IA.LINK
END;
IF С <> 'A' THEN { нет элемента }
Сравните с той же операцией при моделировании массивом.
Включение в список после элемента с указателем I.
NEW(J);
JMNF := С;
JA.LINK := IA.LINK;
IA.LINK := J;
Удаление из списка после элемента с указателем I.
J := IA.LINK;
IA.LINK := JA.LINK;
С := JMNF; { убрать, если информацию сохранять не надо }
DISPOSE(J);
Мы выполнили операции включения и удаления после элемента, на который указывает I.
Добавлять перед элементом или удалять сам текущий элемент невозможно, т.к. связь с предыдущим элементом отсутствует.
Однако простой прием позволяет преодолеть эту трудность.
Добавление перед: добавить после элемента с указателем I, а затем поменять местами информационные части добавленного и предыдущего элементов.
NEW(J);
JA.LINK := IA.LINK;
IA.LINK := J;
JA.INF:= IMNF;
IMNF := C;
Удаление самого элемента: поменять местами следующий и текущий элементы списка, а затем удалить следующий элемент.
J := IA.LINK; - нашли следующий
С := JMNF; - запомнили следующий (если нужно)
IMNF := С; - заслали в предыдущий
IA.LINK := JA.LINK; - сменили связь DISPOSE(J); Операция удаления возможна, когда удаляемый элемент не последний в списке.