
- •Содержание
- •Введение
- •Структуры данных Классификация структур данных
- •Операции над данными
- •Понятие алгоритма
- •Массивы Описание массива
- •Представление массивов в памяти
- •Рис 1. Представление вектора в памяти
- •Рис 2. Представление вектора ml в памяти
- •Алгоритмы поиска
- •Алгоритмы сортировки
- •Пример сортировки простыми вставками.
- •Описание записи
- •Операции над записями
- •Записи с вариантами
- •Представление записи в памяти
- •Общие процедуры и функции для работы с файлами
- •Процедуры и функции для работы с типизированными файлами.
- •Сортировка содержимого файлов (Внешняя сортировка)
- •Пример внешней сортировки прямым слиянием
- •Пример внешней сортировки естественным слиянием
- •Динамическая память и данные с динамической структурой
- •Ссылочный тип в языке Pascal
- •Типизированные указатели
- •Нетипизированные указатели
- •Операции над переменными ссылочного типа.
- •Динамические списки
- •Реализация списков на языке Pascal.
- •Стек, очередь, дек
- •Рекурсия
- •Нелинейные структуры данных. Деревья
- •Бинарные деревья
- •Реализация бинарных деревьев
- •Способы обхода бинарных деревьев
- •Сортировка с прохождением бинарного дерева
Динамические списки
Список — набор элементов, расположенных в определенном порядке, к которым применимы операции включения, исключения.
Линейный список —
список, отражающий отношения соседства
между элементами. Т.е. это множество,
состоящее из
узлов (элементов)
,
структурные свойства
которого, по сути, ограничиваются лишь
линейным (одномерным) относительным
положением узлов, т.е. теми условиями,
что если
,
то
является первым; если
,
тоk-му
узлу
предшествует
и за ним следует
;
является
последним узлом.
Длина списка равна числу элементов, содержащихся в списке, список нулевой длины называется пустым списком. Линейные связные списки являются простейшими динамическими структурами данных.
Линейный динамический список — это линейный список, элементы которого располагаются в динамической памяти.
Каждый элемент (узел) связанного списка:
- хранит какую-то информацию — данные,
- указывает на следующий за ним элемент.
Графически связи в списках удобно изображать следующим образом:
Рис. 4. Представление односвязного списка.
Здесь поле INF - информационное поле, данные, NEXT - указатель на следующий элемент списка. Каждый список должен иметь особый элемент, называемый указателем начала списка или головой списка, который обычно по формату отличен от остальных элементов. В поле указателя последнего элемента списка находится специальный признак nil, свидетельствующий о конце списка.
Элементы списка могут быть связаны различными способами. Есть списки, в которых для каждого элемента указатель задает место положения следующего или предыдущего элемента — однонаправленные списки. В двунаправленных списках для каждого элемента задаются два указателя: место положения следующего и предыдущего элемента.
Рис. 5. Представление двусвязного списка
Разновидностью рассмотренных видов линейных списков является кольцевой список, который может быть организован на основе как односвязного, так и двухсвязного списков. При этом в односвязном списке указатель последнего элемента должен указывать на первый элемент; в двухсвязном списке в первом и последнем элементах соответствующие указатели переопределяются.
Реализация списков на языке Pascal.
Type
TAddrElem = ^TElemSpiska;
TElemSpiska = record
inf: integer;
next: TAddrElem;
end;
Var
addrNachSp, addrNovElem, addrElem: TAddrElem;
Begin
addrNachSp:=nil ;
new (addrNovElem);
addrNovElem^.info : =5 ;
addrNovElem^.next:=nil;
End.
Типовые операции над списками:
добавление нового элемента в список;
переход к очередному элементу списка (используется указатель на следующий элемент);
поиск заданного элемента (последовательно просматриваются элементы списка до тех пор, пока не найден искомый элемент или пока не окончен список);
удаление элемента из списка;
проверка, пуст ли список;
очистка списка;
объединение в одном списке двух (или более) линейных списков;
разбиение линейного списка на два (или более) списка;
создание копии линейного списка;
определение количества узлов в списке;
сортировка узлов в порядке возрастания значений в определенных полях этих узлов;
поиск узла с заданным значением в некотором поле;
печать списка.
Добавление элемента в список
Для добавления в начало списка должен модифицироваться указатель на начало списка, как показано на рис. 6.
Рис. 6. Вставка элемента в начала 1-связного списка
addrNovElem^.next := addrNachSp;
addrNachSp:=addrNovElem;
Добавление элемента в список после элемента, на который ссылается указатель, показана на рис.7.
Рис. 7. Вставка элемента в середину 1-связного списка
New(addrNovElem);
addrNovElem^.next:=addrElem^.next;
addrElem^.next:=addrNovElem;
Просмотр элементов списка
Для просмотра элементов списка необходимо выполнить последовательный переход по ссылкам элементов, начиная с головы списка.
Удаление элемента из списка
Различают удаление
- первого элемента;
- элемента из середины списка
- последнего элемента.