Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по дисциплине АОП.docx
Скачиваний:
66
Добавлен:
24.04.2019
Размер:
2.91 Mб
Скачать

Void visit(List1* l) {

printf("%5.1f ", l->elem);

}

Void traverse(List1* l) {

if (l == NULL) return;

// visit(l); // печать списка в прямом направлении

traverse(l->next); // рекурсивный вызов

// visit(l); // печать списка в обратном направлении

}

Void Print_l1(List1 *l) {

if (l->next == NULL) printf("List is empty");

traverse(l->next);

printf("\n----------------\n");

}

Вопрос №89. Двунаправленный список: основные характеристики и внутреннее устройство.

Каждый узел двунаправленного списка содержит два указателя, один из которых – next указывает на «соседа» справа, а второй – prev – на «соседа» слева:

Определение структуры для двунаправленного списка и алгоритм его инициализации выглядят так:

typedef struct List2 {

double elem; struct List2 *prev, *next; } List2;

List2* init_L2() {

List2 *l = (List2*)calloc(1, sizeof(List2));

l->prev = l->next = NULL;

}

Вопрос №90. Циклический (кольцевой) список: основные характеристики и внутреннее устройство.

Двунаправленные списки на практике часто используются в форме кольцевых списков, вид которых иллюстрируется следующим рисунком:

Определение структуры для кольцевого списка и алгоритм его инициализации выглядят так:

typedef struct List2 {

double elem; struct List2 *prev, *next; } List2;

List2* init_L2() {

List2 *l = (List2*)calloc(1, sizeof(List2));

l->prev = l->next = l;

}

Вопрос №91. Алгоритм включения элемента в кольцевой список.

Использование фиктивного узла – ограничителя и наличие двух указателей в каждом узле позволяет существенно упростить задачу включения нового узла в кольцевой список и даже немного расширить возможности включения. Ниже представлен текст функции Insert_L2, которая выполняет включение нового узла как слева, так и справа от заданного узла, причем в качестве заданного узла может выступать и ограничитель.

Необходимость в специальных функциях «включить в начало» и «включить в хвост» отпадает, т.к. их заменяют вызовы универсальной функции Insert_L2 с параметрами «включить справа от ограничителя» и «включить слева от ограничителя» .

Void Insert_l2(List2 *l, double z, int direction) {

List2* p = (List2*)calloc(1, sizeof(List2));

p->elem = z;

if (direction < 0) { // включение слева

p->next = l; p->prev = l->prev;

l->prev = p; p->prev->next = p;

} else { //

p->next = l->next; p->prev = l;

l->next = p; p->next->prev = p;

}

}

На рисунке ниже приведена схема, объясняющая алгоритм включения элемента в кольцевой список:

p->next = l->next; p->prev = l;

l->next = p; p->next->prev = p;

Корневые деревья

Вопрос №92. Определение понятия «корневое дерево». Свойства корневых деревьев.

Понятие корневое дерево объединяет в себе различные «нелинейные» структуры данных, для узлов которых определены не только направления перемещения к другим узлам «вправо» и «влево», но и «вверх», «вниз-влево», «вниз-вправо» и др.

Общим признаком «древовидных» структур является наличие единственного корня – узла, для которого указатель «вверх» всегда равен NULL.

Узел корневого дерева, как и узел связанного списка, хранит «полезную» информацию и некоторое множество указателей, количество и назначение которых зависит от вида дерева.

Вопрос №93. Бинарное дерево: основные характеристики и внутреннее устройство.

Бинарное дерево – это разновидность корневого дерева, каждый узел которого (кроме корня) имеет единственного предка и не более двух потомков.

Вопрос №94. Алгоритм включение узла в бинарное дерево.

Рассмотрим две функции, позволяющие включить новый узел в бинарное дерево в качестве потомка заданного узла и последовательность их вызова для формирования примера.

Вопрос №95. Алгоритмы обхода бинарного дерева.

Рассмотрим задачу вывода на печать сформированного двоичного дерева. Эта задача является частным случаем задачи обхода дерева – посещения всех узлов дерева и выполнения некоторых действий в каждом узле.

Из теории известно, что существуют три основных порядка возможного посещения узлов бинарного дерева: