Создать бинарное дерево с типом узлов enum - C (СИ)

Узнай цену своей работы

Формулировка задачи:

нужно создать бинарное дерево с типом узов enum как будет выглядить структура и создание такого дерева?

Решение задачи: «Создать бинарное дерево с типом узлов enum»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. enum item
  5. {
  6.     ITEM1, ITEM2, ITEM3
  7. };
  8.  
  9. struct node
  10. {
  11.     enum item item;
  12.     struct node* left;
  13.     struct node* right;
  14. };
  15.  
  16. struct bin_tree
  17. {
  18.     struct node* root;
  19. };
  20.  
  21. void init(struct bin_tree*);
  22. void insert(struct bin_tree*, enum item);
  23. int member(const struct bin_tree*, enum item);
  24. void destroy(struct bin_tree*);
  25.  
  26. #define TEST(EXPR) printf(#EXPR ": %s\n", ((EXPR) != 0 ? "true" : "false"))
  27.  
  28. int main(void)
  29. {
  30.     enum item items[] = {ITEM2, ITEM1, ITEM2};
  31.     size_t i;
  32.     struct bin_tree tree;
  33.    
  34.     init(&tree);
  35.     for(i = 0; i < sizeof(items) / sizeof(*items); ++i)
  36.         insert(&tree, items[i]);
  37.  
  38.     TEST(member(&tree, ITEM1));
  39.     TEST(member(&tree, ITEM2));
  40.     TEST(member(&tree, ITEM3));
  41.    
  42.     destroy(&tree);
  43.  
  44.     exit(0);
  45. }
  46.  
  47.  
  48. void init(struct bin_tree* tree)
  49. {
  50.     tree->root = NULL;
  51. }
  52.  
  53. struct node* insert_node(struct node* node, enum item item)
  54. {
  55.     if(node == NULL)
  56.     {
  57.         node = malloc(sizeof(struct node));
  58.         node->left = node->right = NULL;
  59.         node->item = item;
  60.     }
  61.     else if(item < node->item)
  62.         node->left = insert_node(node->left, item);
  63.     else if(item > node->item)
  64.         node->right = insert_node(node->right, item);
  65.     return node;
  66. }
  67.  
  68. void insert(struct bin_tree* tree, enum item item)
  69. {
  70.     tree->root = insert_node(tree->root, item);
  71. }
  72.  
  73. int member_node(const struct node* node, enum item item)
  74. {
  75.     if(node == NULL)
  76.         return 0;
  77.     if(item < node->item)
  78.         return member_node(node->left, item);
  79.     if(item > node->item)
  80.         return member_node(node->right, item);
  81.     return 1;
  82. }
  83.  
  84. int member(const struct bin_tree* tree, enum item item)
  85. {
  86.     return member_node(tree->root, item);
  87. }
  88.  
  89. void destroy_node(struct node* node)
  90. {
  91.     if(node != NULL)
  92.     {
  93.         destroy_node(node->left);
  94.         destroy_node(node->right);
  95.         free(node);
  96.     }
  97. }
  98.  
  99. void destroy(struct bin_tree* tree)
  100. {
  101.     destroy_node(tree->root);
  102.     tree->root = NULL;
  103. }

Объяснение кода листинга программы

В данном коде реализована реализация двоичного дерева с использованием enum для определения типа узла. Список действий, которые происходят в коде:

  1. #include Указывает компилятору включить в программу функции файла стандартного ввода/вывода.
  2. #include Указывает компилятору включить в программу функции файла стандартного ввода/вывода и malloc.
  3. enum item Определяет перечисление (enum) с тремя значениями.
  4. struct node Определяет структуру узла с полями: enum item item; struct node left; struct node right.
  5. struct bin_tree Определяет структуру связного списка с полем root.
  6. *void init(struct bin_tree)** Инициализирует связный список пустым.
  7. struct node insert_node(struct node node, enum item item) Рекурсивная функция для вставки нового узла в дерево. Если узел пуст, то создается новый узел, иначе рекурсивно вызывается функция для левого или правого поддерева в зависимости от значения enum.
  8. *void insert(struct bin_tree, enum item item)** Вставляет новый узел в корень дерева.
  9. *int member_node(const struct node node, enum item item)** Рекурсивная функция для проверки наличия enum в поддереве, начиная с указанного узла.
  10. *int member(const struct bin_tree, enum item item)** Проверяет наличие enum в дереве.
  11. *void destroy_node(struct node node)** Рекурсивная функция для удаления узла и всех его потомков.
  12. *void destroy(struct bin_tree tree)** Удаляет все узлы дерева.
  13. int main(void) Главная функция программы.
  14. enum item items[] = {ITEM2, ITEM1, ITEM2}; Массив для тестовых значений enum.
  15. size_t i; Переменная для итерации по массиву.
  16. struct bin_tree tree; Создание связного списка для хранения дерева.
  17. init(&tree); Инициализация связного списка.
  18. *for(i = 0; i < sizeof(items) / sizeof(items); ++i)** Цикл для добавления всех тестовых значений enum в дерево.
  19. TEST(member(&tree, ITEM1)); Вывод результата проверки наличия первого тестового значения enum в дереве.
  20. TEST(member(&tree, ITEM2)); Вывод результата проверки наличия второго тестового значения enum в дереве.
  21. TEST(member(&tree, ITEM3)); Вывод результата проверки наличия третьего тестового значения enum в дереве.
  22. destroy(&tree); Удаление всех узлов дерева.
  23. exit(0); Завершение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы