Отчет к пр 8
.docxФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Кафедра безопасности информационных систем
ОТЧЁТ
по практической работе № 8 на тему: «Нелинейные динамические структуры данных. Бинарные деревья»
по дисциплине «Алгоритмы и структуры данных»
Выполнил: студент группы ИСТ-114, Медведева С.Г.,
«14» декабря 2022 г. ___________/Медведева С.Г.
Принял: к.ф.-м.н., доцент, И.А. Моисеев
«14» декабря 2022 г. ___________/ И.А. Моисеев /
1 Основная часть
Цель работы
Необходимо создать структуру с полями
1. ФИО - фамилия и инициалы, символьный массив.
2. Год рождения - целочисленная переменная.
3. Регион
4. Номер телефона - символьный массив.
5. Группа
Требуется создать четыре линейных списка, состоящих из 6 таких структур. Имя каждого файла
должно начинаться с номера группы.
1) Ознакомиться с теоретическим материалом задания.
2) Разработать программу, которая:
a. Считывает данные из примера ранее рассматриваемого текстового файла (*.txt) и
формирует четыре линейные динамические структуры (либо связные списки, либо
очереди, либо стеки), ключом формирования является номер группы (ИСТ-111,
ИСТ-112, ИСТ-113, ИСТ-114). Данные считываются в том порядке, в каком они представлены в текстовом файле*.txt.
b. Для каждого динамического списка (для каждой группы) программа строит и выводит на экран бинарное дерево поиска и сбалансированное бинарное деревопо
ключу Фамилия.
Результаты выполнения работы
#include <iostream> #include <fstream> #include <string.h> using namespace std; struct people{ string FIO; string yearB; string r; string numberPhone; string group; }; struct node{ people key; int count; node * left; node * right; }; void Vyvod(node **w,int l=0){ if (*w!=NULL) { Vyvod(&((**w).right),l+1); for (int i=0; i<l*2; i++) cout << "\t"; cout << (**w).key.FIO << endl; // for (int i=0; i<l*2; i++) // cout << "\t"; // cout << (**w).key.yearB << endl; // for (int i=0; i<l*2; i++) // cout << "\t"; // cout << (**w).key.r << endl; // for (int i=0; i<l*2; i++) // cout << "\t"; // cout << (**w).key.numberPhone << endl; // for (int i=0; i<l*2; i++) // cout << "\t"; // cout << (**w).key.group << endl; Vyvod(&((**w).left),l+1); } } void findNode(node ** root,node * node) { if (*root == nullptr){ *root = node; return; } if (strcmp((*root)->key.FIO.c_str(),node->key.FIO.c_str()) <0) findNode(&((*root)->right),node); else findNode(&((*root)->left),node); } void addTree(node** root, people p){ node *newRoot = *root; node *newNode = new node(); newNode->key = p; newNode->count = 1; newNode->left = nullptr; newNode->right = nullptr; if (newRoot == nullptr){ *root = newNode; } else{ findNode(root,newNode); } } int height(node * root){ if (root == nullptr) return 0; return max(height(root->right)+1,height(root->left)+1); } int balance(node * root){ return height(root->right) - height(root->left); } void addTreeB (node** root, people newP){ if (*root == nullptr){ node *newNode = new node(); newNode->key = newP; newNode->count = 1; newNode->left = nullptr; newNode->right = nullptr; *root= newNode; return; } if (balance(*root) == 0){ addTreeB(&((*root)->right), newP); return; } else if (balance(*root) == 1) { addTreeB(&((*root)->left), newP); return; } else{ addTreeB(&((*root)->right), newP); return; } } void readFile(ifstream &file, node **root,node **rootB){ people newP; if (file.is_open()){ while(!file.eof()){ getline(file, newP.FIO); getline(file, newP.yearB); getline(file, newP.r); getline(file, newP.numberPhone); getline(file, newP.group); addTree(root,newP); if (*rootB == nullptr){ node *newNode = new node(); newNode->key = newP; newNode->left = nullptr; newNode->right = nullptr; *rootB=newNode; } else addTreeB(rootB,newP); } } else cout << "Файл не найден"; } int main() { cout << "Группа ИСТ-114:" << endl; ifstream fin(R"(C:\Users\sonik\CLionProjects\Lab8\f.txt)"); node** root = new node*(); node ** rootB = new node * (); *root = nullptr; *rootB = nullptr; readFile(fin,root,rootB); cout << "Бинарное дерево поиска: " << endl; Vyvod(root); cout << endl; cout << "Бинарное cбалансированное дерево: " << endl; Vyvod(rootB); delete(root); delete(rootB); cout << endl; cout << endl << "Группа ИСТ-111:" << endl; ifstream fin111(R"(C:\Users\sonik\CLionProjects\Lab8\ist111.txt)"); root = new node*(); rootB = new node * (); *root = nullptr; *rootB = nullptr; readFile(fin111,root,rootB); cout << "Бинарное дерево поиска: " << endl; Vyvod(root); cout << endl; cout << "Бинарное cбалансированное дерево: " << endl; Vyvod(rootB); //cout << balance(*rootB); delete(root); delete(rootB); }
САНКТ-ПЕТЕРБУГР
2022