hpnq

pizda

Jun 28th, 2024
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <iomanip>
  4. #include <string.h>
  5. #include <windows.h>
  6. using namespace std;
  7.  
  8.  
  9.  
  10.  
  11.  
  12. struct Countries {
  13. string name; //название страны
  14. string capital; //столица
  15. double population; //численность населения
  16. double populationPercent; //процент населения от общемирового
  17. double area; //площадь
  18. };
  19.  
  20. struct node // описание узла дерева
  21. {
  22. Countries countries;// поле данных - переменная типа страна
  23. node* left, * right; // указатели на левое и правое поддеревья
  24. };
  25.  
  26.  
  27.  
  28.  
  29.  
  30. struct qnode{
  31. Countries info;
  32. qnode *next;
  33. };
  34.  
  35. void push(qnode **start, qnode **end, Countries &d){
  36. qnode *p = new qnode;
  37. p->info = d;
  38. p->next = nullptr;
  39. if(*end){
  40. (*end)->next = p;
  41. }else{
  42. (*start) = p;
  43. }
  44. *end = p;
  45. }
  46.  
  47. void print(qnode *start){
  48. cout << "\n";
  49.  
  50. while(start!= nullptr){
  51. // cout << start->info << "\n";
  52. start = start->next;
  53. }
  54. }
  55.  
  56. void uni(qnode **s, qnode **e, qnode *s1, qnode *s2){
  57. qnode* p1 = s1;
  58. qnode* p2 = s2;
  59. while(p1 != nullptr){
  60. push(s, e, p1->info);
  61. p1 = p1->next;
  62. }
  63. while(p2 != nullptr){
  64. push(s, e, p2->info);
  65. p2 = p2->next;
  66. }
  67.  
  68. }
  69.  
  70.  
  71.  
  72. void inputstudent(Countries& countries)//ввод данных о студенте
  73. {
  74. cout << "Введите название страны: " << endl;
  75. cin >> countries.name;
  76. cout << "Введите столицу:" << endl;
  77. cin >> countries.capital;
  78. cout << "Введите численность населения:" << endl;
  79. cin >> countries.population;
  80. cout << "Введите процент населения от общемирового:" << endl;
  81. cin >> countries.populationPercent;
  82. cout << "Введите площадь:" << endl;
  83. cin >> countries.area;
  84.  
  85. }
  86.  
  87.  
  88. //ввод массива с клавиатуры
  89. void inputMasFromKeyboard(Countries*& mas, qnode*& q, unsigned int& size)
  90. {
  91. cout << "Введите размер массива" << endl;
  92. cin >> size;
  93. if (size == 0) return;//если размер=0, то выходим из функции
  94. mas = new Countries[size];//создаем динамический массив
  95. int i;//индекс элемента массива
  96. for (i = 0; i < size; i++)
  97. {
  98.  
  99. cout << "Введите информацию о стране:" << endl;
  100. inputstudent(q->info);
  101. q = q->next;
  102. }
  103. }
  104.  
  105. void printStudent(Countries countries)//печать данных о студенте
  106. {
  107. cout << left << setw(10) << countries.name << setw(15) << countries.capital << setw(10) << countries.population << setw(9)
  108. << countries.populationPercent << setw(5) << countries.area << endl;;
  109.  
  110. }
  111.  
  112. void printMas(Countries* mas, qnode *q1, unsigned int size)
  113. {
  114. if (!size) return;
  115. cout << "Созданный массив с информацией о странах:" << endl;
  116. cout << left << setw(10) << "Название" << setw(15) << "Столица" << setw(10) << "Числ.населения" << setw(9)
  117. << "Процент населения" << setw(5) << "Площадь" << endl;
  118. for (int i = 0; i < size; i++)
  119. {
  120. printStudent(q1->info);
  121. q1 = q1->next;
  122. }
  123. }
  124.  
  125.  
  126. void insert(node** p, Countries countries) // добавление узла в дерево поиска
  127. {
  128. if (*p == NULL)//или (!*p) //нашли пустой указатель – пустое место
  129. { //создаём новый узел дерева на найденном месте
  130. *p = new node;
  131. (*p)->countries = countries;
  132. (*p)->left = NULL;
  133. (*p)->right = NULL;
  134. }
  135. else
  136. { //если текущий узел не пуст
  137. if (countries.name < (*p)->countries.name) insert(&(*p)->left, countries); //идём в левое поддерево
  138. if (countries.name > (*p)->countries.name) insert(&(*p)->right, countries); //идём в правое поддерево
  139. //одинаковые значения не добавляем!
  140. }
  141. }
  142.  
  143. // распечатка дерева в симметричном порядке
  144. void printsim(const node* p)
  145. {
  146. if (p != NULL) // если дерево не пусто
  147. {
  148. printsim(p->left); // печатаем левое поддерево
  149. printStudent(p->countries); // печатаем значение поля - всю структуру типа tstudent
  150. printsim(p->right); // печатаем правое поддерево
  151. }
  152. }
  153.  
  154.  
  155. void clear(node** p) // очистка дерева
  156. {
  157. if ((*p) != NULL) // если дерево не пусто
  158. {
  159. clear(&(*p)->left); // удаляем левое поддерево
  160. clear(&(*p)->right); // удаляем правое поддерево
  161. delete* p; //Удаляем указатель на текущий узел
  162. *p = NULL;//Присваиваем ему пустой указатель
  163. }
  164. }
  165.  
  166.  
  167. //функция создания деревьев из массива
  168. void createTrees(Countries* mas, qnode* q1, unsigned int size, node** root1, node** root2)
  169. {
  170. if (!size) return;
  171. for (int i = 0; i < size; i++)
  172. {
  173. if (q1->info.population > 100) insert(root1, q1->info); // Добавляем новый узел в первое дерево поиска
  174. else insert(root2, q1->info); // Добавляем новый узел в первое дерево поиска
  175. }
  176. }
  177.  
  178.  
  179. //нахождение количества узлов
  180. int count(const node* p)
  181. {
  182. if (p == NULL) return 0;
  183. return 1 + count(p->left) + count(p->right);
  184. }
  185.  
  186.  
  187.  
  188. // высота дерева
  189. int height(const node* p)
  190. {
  191. if (p == NULL) return 0;
  192. //иначе
  193. int h1 = height(p->left);//считаем высоту левого поддерева
  194. int h2 = height(p->right);//считаем высоту правого поддерева
  195. if (h1 >= h2) return h1 + 1;//возвращаем высоту большего из них+1 - так как добавляем наш узел
  196. return h2 + 1;
  197. }
  198.  
  199.  
  200.  
  201. //печать значений узлов из самой длинной ветки
  202. void printLong(const node* p)
  203. {
  204. if (p != NULL)
  205. {
  206. printStudent(p->countries);
  207. int h1 = height(p->left);
  208. int h2 = height(p->right);
  209. if (h1 >= h2) printLong(p->left);
  210. else printLong(p->right);
  211. }
  212. }
  213.  
  214.  
  215.  
  216. double sayminarea(const node *p ){
  217. if (p != NULL) // если дерево не пусто
  218. {
  219.  
  220. double s1 = sayminarea(p->left); // печатаем левое поддерево
  221. double s2 = sayminarea(p->right); // печатаем правое поддерево
  222. return min(p->countries.area, min(s1, s2)); // минимальная площадь поддеревьев.
  223. }
  224.  
  225. return 100000000; //
  226. }
  227. int saymaxlevel(const node *p, string s){
  228. //height
  229.  
  230. if (p != NULL) // если дерево не пусто
  231. {
  232.  
  233. int s1 = saymaxlevel(p->left, s); // печатаем левое поддерево
  234. int s2 = saymaxlevel(p->right, s); // печатаем правое поддерево
  235. if(p->countries.name[0] == s[0]){
  236. return max(height(p), max(s1, s2)); // минимальная площадь поддеревьев
  237. }
  238. return max(s1, s2);
  239. }
  240. return 0 ;
  241.  
  242. }
  243. int main() {
  244. SetConsoleCP(1251);
  245. SetConsoleOutputCP(1251);
  246. Countries* mas = NULL;//указатель на динамический массив типа Студент
  247. unsigned int size = 0;
  248. qnode* q1 = NULL;
  249. inputMasFromKeyboard(mas, q1, size);
  250. if (size) {
  251.  
  252. node* root1 = NULL, * root2 = NULL; // Указатели на корень первого и второго деревьев
  253. printMas(mas, q1, size);
  254. cout << endl;
  255.  
  256. createTrees(mas, q1, size, &root1, &root2);
  257.  
  258. cout << "Распечатка первого дерева в симметричном порядке" << endl;
  259. printsim(root1); // распечатка первого дерева в симметричном порядке
  260. cout << endl;
  261. cout << "Распечатка второго дерева в симметричном порядке" << endl;
  262. printsim(root2); // распечатка второго дерева в симметричном порядке
  263. cout << endl;
  264. cout << "Количество узлов первого дерева " << count(root1) << endl;
  265. cout << endl;
  266. cout << "Узлы длинной ветки:" << endl;
  267. printLong(root2);
  268.  
  269. // ------------ задача 5--------------
  270.  
  271. sayminarea(root1);
  272. // ------------ задача 6--------------
  273. string s;
  274. cin >> s;
  275. saymaxlevel(root2, s); // второе дерево , ищем высоту начинающегося с "Г"
  276.  
  277.  
  278. // ------------ задача 7--------------
  279.  
  280. clear(&root1); //Вызов функции очистки дерева
  281. if (!root1) cout << "Дерево успешно очищено!" << endl;
  282. clear(&root2); //Вызов функции очистки дерева
  283. if (!root2) cout << "Дерево успешно очищено!" << endl;
  284.  
  285. delete[] mas;
  286. }
  287. else cout << "Размер массива равен 0" << endl;
  288. return 0;
  289. }
  290.  
Advertisement
Add Comment
Please, Sign In to add comment