Advertisement
NikolayChukanov

l24

Nov 12th, 2023
673
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.58 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. // Структура для представления узла дерева
  6. typedef struct Node {
  7.     char data;
  8.     struct Node* left;
  9.     struct Node* right;
  10. } Node;
  11.  
  12. // Функция для создания нового узла
  13. Node* createNode(char data) {
  14.     Node* newNode = (Node*)malloc(sizeof(Node));
  15.     newNode->data = data;
  16.     newNode->left = NULL;
  17.     newNode->right = NULL;
  18.     return newNode;
  19. }
  20.  
  21. // Функция для освобождения памяти, выделенной под дерево
  22. void freeTree(Node* root) {
  23.     if (root != NULL) {
  24.         freeTree(root->left);
  25.         freeTree(root->right);
  26.         free(root);
  27.     }
  28. }
  29.  
  30. // Функция для преобразования выражения в дерево
  31. Node* expressionToTree(const char* expression, int* index) {
  32.     char token = expression[*index];
  33.  
  34.     if (token == '(') {
  35.         (*index)++; // Пропускаем '('
  36.         token = expression[*index];
  37.  
  38.         Node* root = createNode(token);
  39.         (*index)++; // Переходим к следующему токену
  40.  
  41.         root->left = expressionToTree(expression, index);
  42.  
  43.         (*index)++; // Пропускаем символ операции
  44.         token = expression[*index];
  45.  
  46.         root->right = expressionToTree(expression, index);
  47.  
  48.         (*index)++; // Пропускаем ')'
  49.         return root;
  50.     } else {
  51.         return createNode(token);
  52.     }
  53. }
  54.  
  55. // Функция для обхода дерева и выполнения преобразований
  56. Node* transformExpression(Node* root) {
  57.     if (root == NULL) {
  58.         return NULL;
  59.     }
  60.  
  61.     // Рекурсивно обрабатываем левое и правое поддеревья
  62.     root->left = transformExpression(root->left);
  63.     root->right = transformExpression(root->right);
  64.  
  65.     // Если текущий узел представляет операцию умножения
  66.     if (root->data == '*') {
  67.         // Выполняем преобразование (a*c)/(b*d)
  68.         root->data = '/';
  69.         Node* temp = createNode('*');
  70.         temp->left = root->left->right;
  71.         temp->right = root->right->left;
  72.         root->left->right = temp;
  73.         root->right->left = NULL;
  74.     }
  75.  
  76.     return root;
  77. }
  78.  
  79. // Функция для вывода выражения в виде инфиксной записи
  80. void printInfix(Node* root) {
  81.     if (root != NULL) {
  82.         printf("(");
  83.         printInfix(root->left);
  84.         printf("%c", root->data);
  85.         printInfix(root->right);
  86.         printf(")");
  87.     }
  88. }
  89.  
  90. int main() {
  91.     while (1) {
  92.         // Ввод выражения с консоли
  93.         printf("Enter an expression (or 'exit' to quit): ");
  94.         char expression[100];
  95.         fgets(expression, sizeof(expression), stdin);
  96.  
  97.         // Проверка на выход
  98.         if (strcmp(expression, "exit\n") == 0) {
  99.             break;
  100.         }
  101.  
  102.         int index = 0;
  103.         Node* root = expressionToTree(expression, &index);
  104.  
  105.         printf("Original Expression (Tree): ");
  106.         printInfix(root);
  107.         printf("\n");
  108.  
  109.         // Выполняем преобразование
  110.         Node* result = transformExpression(root);
  111.  
  112.         printf("Transformed Expression (Tree): ");
  113.         printInfix(result);
  114.         printf("\n");
  115.  
  116.         // Освобождаем память, выделенную под дерево
  117.         freeTree(root);
  118.         freeTree(result);
  119.     }
  120.  
  121.     return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement