- •2 Статические и динамические объекты программ.
- •6 Вектор. Функциональная спецификация. Логическое описание и физическое представление.
- •14 Стек. Физическое представление (динамические объекты).
- •8 Очередь. Логическое описание и физическое представление (файл).
- •9 Очередь. Логическое описание и физическое представление (массив).
- •10 Очередь. Логическое описание и физическое представление (динамические объекты).
- •61 Обьектно-ориентированное программирование.
- •11 Стек. Функциональная спецификация
- •12 Стек. Логическое описание.
- •17 Линейный список. Физическое представление. Итераторы.
- •Void Create(List *l){ //создание списка
- •If(!res.Node) //если не удалось выделить память (массив заполнен)
- •19 Линейный список. Физическое представление (динамические объекты).
- •29 Рекурсивные структуры данных и их связь с алгоритмической рекурсией
- •1 Уровни описания структур данных.
- •Деревья. Двоичные деревья.
- •23 Двоичное дерево. Функциональная спецификация
- •24 Двоичное дерево. Логическое описание. Построение и визуализация
- •27 Особенности представления и обработки деревьев общего вида (преобразование к двоичному,...)
- •28 Деревья выражений
- •33 Поиск по образцу в последовательностях и таблицах.
- •34 Алгоритм Кнута-Морриса-Пратта
- •37 Таблицы с прямым доступом.
- •43 Турнирные сортировки.
- •46 Сравнение методов сортировки.
- •50 Абстрактные типы данных. Пример модуля лтд очередь.
- •52 Типизация языка программирования. Контроль типов.
- •53 Средства ослабления типового контроля в языке Паскаль. Преобразование и передача типов.
- •54 Полиморфизм операций, отношений и процедур. Родовые модули.
- •41 Обменные сортировки
19 Линейный список. Физическое представление (динамические объекты).
Поскольку список двунправленный, каждый его элемент содержит ровно по две ссылки: на предыдущий и на последующий элементы списка. =>введём терминатор – элемент next которого указывает на первый элемент списка, а prev – на последний (сведя тем самым количество указателей до 1го, т.е. Для обращения к списку идём в терминатор). Сначала обращаемся к терминатору, через него, в свою очередь, — к первому и последнему элементам списка, а через них — строго последовательно и к остальным.Описание структуры содержит две переменные: указатель на фиктивный элемент и его длину:
typedef struct{
struct Item *head;
int size;
}List;
Create() выделяет память под терминатор, создает пустой кольцевой список путем присваивания компонентам prev и next значения указателя на терминатор и устанавливает равной 0 длину списка. First() создает итератор из ссылочной компоненты next терминатора списка. Last() создает итератор из указателя на терминатор списка. Size() возвращает хранимый размер списка. Insert() вставляет элемент в список ПЕРЕД заданным.
Графически это выглядит так: (там “ I” и “rec”)
Ф-ия Delete() удаляет элемент, на который указывает итератор, возвращая в качестве результата итератор, ссылающийся на след. за уделенным элемент. Ф-ия Destroy() уничтожает список, перебирая его элементы и удаляя их.
29 Рекурсивные структуры данных и их связь с алгоритмической рекурсией
Простейшей рекурсивной структурой данных является односвязный список. Определяется он следующим образом: Односвязным списком является пустой список, который не содержит ничего: [] (списки в формальном определении заключаются в квадратные скобки).
Односвязным списком является элемент, называемый головой, и стоящий после него односвязный список, называемый хвостом: [x|L], где x — элемент, а L — какой-то список (прямая черта служит для разделения элементов).
Элементом списка может быть что угодно — число, указатель, даже другой список. Список является упорядоченной структурой данных, то есть, порядок элементов в нём фиксированный.
Язык Си не позволяет задавать рекурсивные структуры напрямую, но поскольку элементом структуры может быть указатель на неё, списки можно реализовать через них.
Пустым списком будем считать указатель NULL. А непустым — указатель на такую структуру:
typedef struct ONE_WAY_LIST
{ int data;
struct ONE_WAY_LIST* tail;
} one_way_list;
Поле data — это данные, хранящиеся в списке. Разумеется, они могут быть заменены на любые другие. А tail — хвост списка.
20 Списки общего вида. Графы.
Граф – это совокупность непустого множества вершин и множества пар вершин (дуг (для неор.) или ребер). 2 вершины называются смежными, если в графе есть дуга (ребро), соединяющая эти вершины.
Граф представляется в виде матрицы смежности. Матрица смежности для графа А — матрица M(A) = [aij] порадка n { aij = 1, if есть ребро (vi , vj); elseaij = 0 } (аналогично для неор. Графа)
Другие представления графа в ЭВМ: а) целочисленный массив из n столбцов и m сторок (m – макс. Число вершин, смежных с произвольной вершиной графа) – удобен, когда у многих вершин графа количество смежных близко к m б) граф описывается в виде основного списка вершин и списков дуг; в основном списке перечислены узлы (вершины графа), каждый из которых указывает на свой список дуг; каждый узел списка дуг указывает на узел основного списка, входящего в соответствующую дугу
Поиск в глубину: Алгоритм поиска описывается следующим образом: для каждой не пройденной вершины необходимо найти все не пройденные смежные вершины и повторить поиск для них. Используется в качестве подпрограммы в алгоритмах поиска одно- и двусвязных компонент, топологической сортировки.
Поиск в ширину: Поиск в ширину выполняется в следующем порядке: началу обхода s приписывается метка 0, смежным с ней вершинам – метка 1. Затем поочередно рассматривается окружение всех вершин с метками 1, и каждой из входящих в эти окружения вершин приписываем метку 2 и т.д. {реализуется через очередь}.