- •А.Н. Горитов
- •Учебное пособие
- •Учебное пособие
- •Введение
- •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 Пути в бесконтурном графе
- •Литература
5.2 Реализация связного списка массивом
Для того, чтобы нагляднее представить себе работу со связанными списками (основные её этапы: – переход к соседним элементам; – включение элемента; – исключение элемента), представим связный список его простейшей моделью – массивом записей (структур), в которой есть дополнительное поле – указатель на следующую запись. (Аналогичную модель можно рассмотреть и для последовательных списков, это очень просто проделать самим). В данном случае указатель будет иметь значение индекса следующего элемента в массиве записей.
CONST MS = 100; TYPE SP = RECORD
INF : T0; { T0 - базовый тип; напр., пусть INF:CHAR; }
LINK : INTEGER
END; VAR SPISOK : ARRAY[1..MS] OF SP;
NACH : INTEGER;
K, I, J : INTEGER;
C : CHAR;
free
nach
12 3
0
4
5
7
H0 гт
6
9
7 8 9 10
11
12
8 H 110 H |2
11
12
H=B
0
Рис. 12
Установлена логическая связь между элементами списка в порядке 3–5–6–9–2 (см. указатели). Признак последнего элемента – значение указателя равно 0. Индекс начала списка находится в переменной nach. Элементы массива 1, 4, 7, 8, 10, 11, 12 в список не включены.
Теперь посмотрим, как будут осуществляться основные операции над списком, заданным в таком виде.
Переход к следующему элементу списка
Пусть i - индекс текущего элемента. Тогда индекс следующего элемента получим:
J := SPISOK[I].LINK;
C := SPISOK[I].INF; - значение I-го элемента
Обратим внимание на то, что связь с предыдущим элементом потеряна совершенно.
Просмотр всего списка с начала
I := NACH;
WHILE I <> 0 DO BEGIN
C := SPISOK[I].INF;
{ обработка c }
I := SPISOK[I].LINK; END;
Просматривать список можно с начала или с промежуточного элемента, но только в сторону конца списка.
Поиск нужного элемента
I := NACH;
WHILE (C <> '...') AND (I <> 0) DO BEGIN
C := SPISOK[I].INF;
I := SPISOK[I].LINK; END; IF C <> '...' THEN { элемент не найден }
Включение в список
Пусть элемент массива с индексом j надо включить в список после элемент i. Например, j = 11, i = 6. Тогда
SPISOK[J].INF := C; занести информацию
SPISOK[J].LINK := SPISOK[I].LINK; занести указатель
SPISOK[I].LINK := J; сменить указатель предыдущего элемента Включение и исключение производится после элемента с заданным номером.
Исключение элемента из списка
Пусть надо исключить из списка элемент, стоящий после элемента с индексом i. Например, i = 3 (следовательно, нужно исключить элемент с j = 5). Для этого нужно указатель элемента j перенести в указатель элемента i.
J := SPISOK[I].LINK; нашли индекс удаляемого элемента
SPISOK[I].LINK := SPISOK[J].LINK; перенесли указатель
C := SPISOK[J].INF; сохранили информацию
Обратим внимание на цикличность и зеркальность операций включения и исключения элементов из списка.
Мы пока не останавливались на вопросе о том, как определяется индекс свободного элемента для включения в список и как распорядиться освобожденным элементом списка.
Освобожденный элемент является "мусором". Выход из положения – все свободные элементы массива связать в еще один список – список свободного пространства.
Теперь перед операцией добавления в основной список нужно взять один элемент из списка свободного пространства (обычно первый – признак стека).
После операции удаления из основного списка надо добавить операцию включения освобожденного элемента в список свободного пространства (в начало этого списка – стек).
Список свободного пространства используется как стек. Теперь две последние операции выполняются следующим образом.
Включение в список после i-го элемента
J := FREE; индекс свободного элемента
FREE := SPISOK[J].LINK; индекс нового свободного элемента SPISOK[J].INF := C; занести информацию
SPISOK[J].LINK := SPISOK[I].LINK; занести указатель
SPISOK[I].LINK := J; сменить указатель предыдущего элемента
Удаление из списка после i-го элемента
J := SPISOK[I].LINK; нашли индекс удаляемого элемента
C := SPISOK[J].INF; переписали информацию
SPISOK[I].LINK := SPISOK[J].LINK; переписали указатель
теперь добавим перед FREE:
SPISOK[J].LINK := FREE; занесли в указатель индекс
свободного элемента
FREE := J; сменили номер свободного элемента
Операции тоже цикличны и выполняются в обратном порядке (зеркальны).
Однако существуют определенные ограничения, накладываемые на выполнение этих операций:
нужна проверка на переполнение при включении элемента;
нужна проверка на исключение элемента после последнего в списке;
как удалить самый первый элемент?
4) как добавить элемент перед первым элементом?