Файл: Министерство образования и науки российской федерации новосибирский государственный технический.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 51
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСТИЕТ
Лабораторная работа №6
по дисциплине «Программирование»
Деревья
Группа:
Студенты:
Преподаватель: Борин В.М.
НОВОСИБИРСК 2023
Задание
Вершина дерева содержит два целых числа и три указателя на поддеревья. Данные в дереве упорядочены. Написать функцию включения нового значения в дерево с сохранением упорядоченности.
Проектирование программы
Обсуждение основных идей алгоритма
Функция получает на вход указатель на начало дерева и число, сравнивает число с элементами ячейки, пока не достигнет конца дерева или не заполненной ячейки, после чего добавляет число в структуру дерева.
«Составные части» программы
Переменные:
a, q – указатели на начало дерева;
left, center, right – временные указатели на списки;
n – счетчик чисел в ячейке;
val_l, val_r – значения ячейки.
Функция добавления элемента:
void add(tree* a, int val) {
if (a->val_l < val && a->n == 2 && a->val_r < val) {//если новое значение больше значений в ячейках добавляем ответвление в правую ветку
if (a->right != NULL) {
add(a->right, val);
}
else {
tree* b = malloc(sizeof(tree));
b->left = NULL;
b->center = NULL;
b->right = NULL;
b->val_l = val;
a->right = b;
b->n = 1;
}
}
if (a->val_l > val && a->n==2) {//если введенное значение меньше минимального в ячейке, создаем ответвление в левую ветку
if (a->left != NULL) {
add(a->left, val);
}
else {
tree* b = malloc(sizeof(tree));
b->left = NULL;
b->center = NULL;
b->right = NULL;
b->val_l = val;
a->left = b;
b->n = 1;
}
}
if ((a->n)==1) {//если второе значение в ячейке не введено, добавляем число
if (val>a->val_l)
a->val_r = val;
else {
a->val_r = a->val_l;
a->val_l = val;
}
a->n = 2;
}
if (a->val_l < val && a->val_r>val && a->n==2) {//если введенное число больше минимального в ячейке
, но меньше максимального, создаем центральную ветку
if (a->center != NULL) {
add(a->center, val);
}
else {
tree* b = malloc(sizeof(tree));
b->left = NULL;
b->center = NULL;
b->right = NULL;
b->val_l = val;
a->center = b;
b->n = 1;
}
}
}
Функция вывода дерева:
void print(tree* a) {
if (a->left != NULL) {//выводим значения левой ветки
print(a->left);
}
printf("%d\n", a->val_l);//выводим минимальное значение верхней ячейки
if (a->center != NULL) {//выводим значения центральной ветки
print(a->center);
}
if (a->n == 2) {//если в верхней ячейке заполнено два числа, выводим наибольшее
printf("%d\n", a->val_r);
}
if (a->right != NULL) {//выводим значения правой ветки
print(a->right);
}
}
Текст программы с комментариями
#include
#include
typedef struct tree {
struct tree* left;//ссылка на левую ветку
struct tree* center;//ссылка на центральную ветку
struct tree* right;//ссылка на правую ветку
int val_l;//меньшее значение
int val_r;//большее значени
int n;//количество чисел в ячейке
} tree;
void add(tree* a, int val) {
if (a->val_l < val && a->n == 2 && a->val_r < val) {//если новое значение больше значений в ячейках добавляем ответвление в правую ветку
if (a->right != NULL) {
add(a->right, val);
}
else {
tree* b = malloc(sizeof(tree));
b->left = NULL;
b->center = NULL;
b->right = NULL;
b->val_l = val;
a->right = b;
b->n = 1;
}
}
if (a->val_l > val && a->n==2) {//если введенное значение меньше минимального в ячейке, создаем ответвление в левую ветку
if (a->left != NULL) {
add(a->left, val);
}
else {
tree* b = malloc(sizeof(tree));
b->left = NULL;
b->center = NULL;
b->right = NULL;
b->val_l = val;
a->left = b;
b->n = 1;
}
}
if ((a->n)==1) {//если второе значение в ячейке не введенно, добавляем число
if (val>a->val_l)
a->val_r = val;
else {
a->val_r = a->val_l;
a->val_l = val;
}
a->n = 2;
}
if (a->val_l < val && a->val_r>val && a->n==2) {//если введенное число больше минимального в ячейке, но меньше максимального, создаем центральную ветку
if (a->center != NULL) {
add(a->center, val);
}
else {
tree* b = malloc(sizeof(tree));
b->left = NULL;
b->center = NULL;
b->right = NULL;
b->val_l = val;
a->center = b;
b->n = 1;
}
}
}
void print(tree* a) {
if (a->left != NULL) {//выводим значения левой ветки
print(a->left);
}
printf("%d\n", a->val_l);//выводим минимальное значение верхней ячейки
if (a->center != NULL) {//выводим значения центральной ветки
print(a->center);
}
if (a->n == 2) {//если в верхней ячейке заполнено два числа, выводим наибольшее
printf("%d\n", a->val_r);
}
if (a->right != NULL) {//выводим значения правой ветки
print(a->right);
}
}
void main() {
tree q;
q.left = NULL;
q.center = NULL;
q.right = NULL;
q.val_l = 7;
q.val_r = 16;
q.n = 2;
add(&q, 3);
add(&q, 9);
add(&q, 1);
add(&q, 2);
add(&q, 568);
add(&q, 4);
add(&q, 11);
add(&q, 15);
add(&q, 14);
print(&q);
}
Пример работы программы
Выводы: Программа решает поставленную задачу с любым количеством элементов дерева.
.