Вывести упорядоченные по убыванию повторяющиеся элементы произвольного одномерного массива - C (СИ)

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

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

Вывести упорядочены по убыванию повторяющиеся элементы произвольного одномерного массива целых чисел и число этих повторений.(СИ)

Решение задачи: «Вывести упорядоченные по убыванию повторяющиеся элементы произвольного одномерного массива»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <malloc.h>
  3.  
  4. typedef struct _node {
  5.     struct _node* left;
  6.     struct _node* right;
  7.     int      val;
  8.     unsigned cnt;
  9. } node;
  10. int  tree_add(node** tr, int val);
  11. void tree_print(FILE* _out, const node* tr);
  12. void tree_clear(node* tr);
  13.  
  14.  
  15. int main(void){
  16.     int  a[] = { 5, 2, 7, 1, 3, 1, 4, 9, 1, 5, 6, 7, 0, 7, 4, 2 };
  17.     int i, n = sizeof(a)/sizeof(a[0]);
  18.     node* tr = NULL;
  19.  
  20.     for(i = 0; i < n; ++i)
  21.         tree_add(&tr, a[i]);
  22.  
  23.     tree_print(stdout, tr);
  24.     tree_clear(tr);
  25.     return 0;
  26. }
  27.  
  28. //добавить
  29. int tree_add(node** tr, int val){
  30.     node* p = *tr;
  31.     while(p != NULL){
  32.         if(val < p->val){
  33.             tr = &p->left;
  34.             p  = p->left;
  35.         } else if(val > p->val){
  36.             tr = &p->right;
  37.             p  = p->right;
  38.         } else {
  39.             ++p->cnt;
  40.             return 0;
  41.         }
  42.     }
  43.  
  44.     p = (node*)malloc(sizeof(node));
  45.     if(p != NULL){
  46.         p->val  = val;
  47.         p->cnt  = 1;
  48.         p->left = p->right = NULL;
  49.         *tr = p;
  50.     }
  51.     return (p != NULL);
  52. }
  53.  
  54. //печать
  55. void tree_print(FILE* _out, const node* tr){
  56.     if(tr != NULL){
  57.         if(tr->right != NULL)
  58.             tree_print(_out, tr->right);
  59.  
  60.         if(tr->cnt > 1)
  61.             fprintf(_out, "value: %d  count: %u\n", tr->val, tr->cnt);
  62.  
  63.         if(tr->left != NULL)
  64.             tree_print(_out, tr->left);
  65.     }
  66. }
  67.  
  68. //удалить всех
  69. void tree_clear(node* tr){
  70.     if(tr != NULL){
  71.         if(tr->right != NULL)
  72.             tree_clear(tr->right);
  73.         if(tr->left != NULL)
  74.             tree_clear(tr->left);
  75.         free(tr);
  76.     }
  77. }

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

В данном коде реализуется алгоритм добавления и печати элементов в двоичном дерево. Для решения задачи вводится структура данных node, которая содержит значения и счетчик повторяющихся значений.

  1. В функции tree_add происходит добавление элемента в дерево. Элемент сравнивается с уже имеющимися в дереве, и если он меньше значения текущего элемента, то он добавляется в левое поддерево, иначе, если элемент больше значения текущего элемента, то он добавляется в правое поддерево. Если элемент равен значению текущего элемента, то увеличивается счетчик повторяющихся элементов и выполняется рекурсивный вызов для левого и правого поддерева. Если элемент не равен ни одному из уже имеющихся в дереве, то он добавляется в дерево, и его значение устанавливается равным данному элементу, а счетчик повторяющихся элементов устанавливается равным 1.
  2. В функции tree_print происходит печать элементов дерева. Если узел не является листовым, то рекурсивно вызывается функция для печати элементов правого и левого поддерева. Для узлов, у которых счетчик повторяющихся элементов больше 1, выводится значение и количество повторений.
  3. В функции tree_clear происходит очистка дерева. Если узел не является листовым, то рекурсивно вызывается функция для очистки элементов правого и левого поддерева. После чего память, занимаемая узлом, освобождается. Таким образом, данный код реализует добавление и печать элементов в двоичном дереве, а также очистку дерева.

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


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

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

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

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

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

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