Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
infa.docx
Скачиваний:
16
Добавлен:
27.09.2019
Размер:
305.64 Кб
Скачать

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 и т.д. {реализуется через очередь}.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]