Advertisement
Zennoma

laba18

May 6th, 2020
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.06 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define COUNT 10
  5. struct Tree { //структура бинарного дерева
  6. char word[20];
  7. int length;
  8. Tree* Left; //указатель на левый потомок
  9. Tree* Right; //указатель на правый потомок
  10. };
  11. Tree* BTree = NULL;
  12. //рекурсивная функция создания/добавления вершины дерева
  13. void AddNode(Tree** BTree, Tree* TreeElement)
  14. {
  15. Tree* rr;
  16. rr = *BTree; //вспомогательный указатель на указатель дерева
  17. if (rr == NULL) *BTree = TreeElement; //если узла нет, создаем узел
  18. else
  19. if (strlen(TreeElement->word) < strlen(rr->word)) //значение тек. узла поддерева < значения узла дерева,
  20. AddNode(&rr->Left, TreeElement); //то заносим значение узла в левое поддерево
  21. else AddNode(&rr->Right, TreeElement); //иначе заносим значение узла в правое поддерево
  22. }
  23. int check(char* st)
  24. {
  25. int fl = 0;
  26. char GL[] = "aeuyoiIAEUYO";
  27. for (int i = 0; i < 12; i++)
  28. if (st[0] == GL[i])
  29. fl++;
  30. return fl;
  31. }
  32. void print2DUtil(Tree* root, int space)
  33. {
  34. if (root == NULL)
  35. return;
  36. space += COUNT;
  37. print2DUtil(root->Right, space);
  38. printf("\n");
  39. for (int i = COUNT; i < space; i++)
  40. printf(" ");
  41. printf("%s [%d],\n", root->word,root->length);
  42. print2DUtil(root->Left, space);
  43. }
  44. void print2D(struct Tree* root)
  45. {
  46. print2DUtil(root, 0);
  47.  
  48. }
  49.  
  50. void Tree2(Tree* r)//обратный
  51. {
  52. if (r != NULL)
  53. {
  54. Tree2(r->Left);
  55. printf("%s|| word length is %d\n", r->word,r->length);
  56. Tree2(r->Right);
  57. }
  58. }
  59. void inOrderTravers(Tree* root) //прямой
  60. {
  61. if (root) {
  62. inOrderTravers(root->Right);
  63. printf("%s|| word length is %d\n", root->word, root->length);
  64. inOrderTravers(root->Left);
  65. }
  66. }
  67. void Treevowels(Tree*r)
  68. {
  69. if (r != NULL)
  70. {
  71. if (check(r->word) > 0)
  72. printf("%4s\n", r->word);
  73. Treevowels(r->Left);
  74. Treevowels(r->Right);
  75. }
  76. }
  77. Tree* DeleteNode(Tree* node) {
  78. if (node == NULL) {
  79. return node;
  80. }
  81. else {
  82. if (node->Left != NULL) {
  83. node->Left = DeleteNode(node->Left);
  84. }
  85. if (node->Right != NULL)
  86. node->Right = DeleteNode(node->Right);
  87. if (check(node->word) > 0) {
  88. Tree* tmp;
  89. if (node->Right == NULL)
  90. tmp = node->Left;
  91. else {
  92. Tree* ptr = node->Right;
  93. if (ptr->Left == NULL) {
  94. ptr->Left = node->Left;
  95. tmp = ptr;
  96. }
  97. else {
  98. Tree* pmin = ptr->Left;
  99.  
  100. while (pmin->Left != NULL) {
  101. ptr = pmin;
  102. pmin = ptr->Left;
  103. }
  104. ptr->Left = pmin->Right;
  105. pmin->Left = node->Left;
  106. pmin->Right = node->Right;
  107. tmp = pmin;
  108. }
  109. }
  110. delete node;
  111. return tmp;
  112. }
  113. }
  114. return node;
  115. }
  116. int main(int argc, char* argv[])
  117. {
  118. //указатель, тип которого соответствует узлу дерева.
  119. //В начале создается пустое дерево
  120.  
  121. //Указатель на узел дерева
  122. Tree* TreeElement;
  123. char* word ; //вводимые значения узлов дерева
  124. word = new char[20];
  125. puts("input words");
  126. while (gets_s(word, 20),strlen(word)!=0) // продолжать вводить пока не будет введено _
  127. {
  128. TreeElement = new Tree; //выделение памяти под узел дерева
  129. strcpy_s(TreeElement->word,20,word);
  130. TreeElement->length = strlen(word);//запись введенного значения в узел дерева
  131. TreeElement->Left = NULL; //задание пустого левого поддерева
  132. TreeElement->Right = NULL; //задание пустого правого поддерева
  133. AddNode(&BTree, TreeElement); // добавление узла TreeElement в дерево BTree
  134. // чтение следующего числа
  135. }
  136. puts(" == Result==");
  137. print2D(BTree); // печать дерева BTree
  138. printf("\n");
  139. puts("sorted way to show. Reverse order");
  140. Tree2(BTree);//Печатает в порядке от самого маленького
  141. printf("\n");
  142. puts("sorted way to show. Straight order");
  143. inOrderTravers(BTree);
  144. printf("\n");
  145. puts("needed words");
  146. Treevowels(BTree);
  147. printf("\n");
  148. puts("after delete");
  149. BTree = DeleteNode(BTree);
  150. Tree2(BTree);
  151. puts("============================");
  152. puts("add new words or press enter to skip");
  153. while (gets_s(word, 20), strlen(word) != 0) // продолжать вводить пока не будет введено _
  154. {
  155. TreeElement = new Tree; //выделение памяти под узел дерева
  156. strcpy_s(TreeElement->word, 20, word); //запись введенного значения в узел дерева
  157. TreeElement->Left = NULL; //задание пустого левого поддерева
  158. TreeElement->Right = NULL; //задание пустого правого поддерева
  159. AddNode(&BTree, TreeElement); // добавление узла TreeElement в дерево BTree
  160. // чтение следующего числа
  161. }
  162. puts("");
  163. puts("============================");
  164. print2D(BTree); // печать дерева BTree
  165. printf("\n");
  166. puts("sorted way to show");
  167. Tree2(BTree);
  168. return 0;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement