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

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

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

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

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

textual
Листинг программы
#include <stdio.h>
#include <malloc.h>
 
typedef struct _node {
    struct _node* left;
    struct _node* right;
    int      val;
    unsigned cnt;
} node;
int  tree_add(node** tr, int val);
void tree_print(FILE* _out, const node* tr);
void tree_clear(node* tr);
 
 
int main(void){
    int  a[] = { 5, 2, 7, 1, 3, 1, 4, 9, 1, 5, 6, 7, 0, 7, 4, 2 };
    int i, n = sizeof(a)/sizeof(a[0]);
    node* tr = NULL;
 
    for(i = 0; i < n; ++i)
        tree_add(&tr, a[i]);
 
    tree_print(stdout, tr);
    tree_clear(tr);
    return 0;
}
 
//добавить
int tree_add(node** tr, int val){
    node* p = *tr;
    while(p != NULL){
        if(val < p->val){
            tr = &p->left;
            p  = p->left;
        } else if(val > p->val){
            tr = &p->right;
            p  = p->right;
        } else {
            ++p->cnt;
            return 0;
        }
    }
 
    p = (node*)malloc(sizeof(node));
    if(p != NULL){
        p->val  = val;
        p->cnt  = 1;
        p->left = p->right = NULL;
        *tr = p;
    }
    return (p != NULL);
}
 
//печать
void tree_print(FILE* _out, const node* tr){
    if(tr != NULL){
        if(tr->right != NULL)
            tree_print(_out, tr->right);
 
        if(tr->cnt > 1)
            fprintf(_out, "value: %d  count: %u\n", tr->val, tr->cnt);
 
        if(tr->left != NULL)
            tree_print(_out, tr->left);
    }
}
 
//удалить всех
void tree_clear(node* tr){
    if(tr != NULL){
        if(tr->right != NULL)
            tree_clear(tr->right);
        if(tr->left != NULL)
            tree_clear(tr->left);
        free(tr);
    }
}

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

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

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

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


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

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

12   голосов , оценка 4 из 5
Похожие ответы