Найти одинаковые элементы в одномерном массиве - C (СИ)

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

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

Здравствуйте! Задачка такая: надо найти в одномерном массиве повторяющиеся элементы и вывести значение одного из элементов. Если в массиве есть несколько групп одинаковых элементов, то необходимо вывести значение элемента, который повторяется чаще. Распишите, пожалуйста, подробнее что и как делали. Спасибо!

Решение задачи: «Найти одинаковые элементы в одномерном массиве»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <glib.h>
 
int * dup_int(const int n) {
    int * p = malloc(sizeof(int));
    assert(p);
    *p = n;
    
    return p;
}
 
void dump(void * key, void * value, void * user_data) {
    printf("%d%s%d\n", *(int*)key, (const char*)user_data, *(int*)value);
}
 
struct PAIR {
    int key;
    int value;
};
 
void find_max_value(void * key, void * value, void * user_data) {
    struct PAIR * sp = (struct PAIR*) user_data;
    int * k = (int*)key;
    int * v = (int*)value;
    
    if ( *v > sp->value ) {
        sp->key = *k;
        sp->value = *v;
    }
}
 
const char * separator = "\t";
 
int main(void) {
    int array[] = { 2, 1, 4, 6, 7, 6, 3, 3, 2, 0, 4, 4 }, i;
    struct PAIR sp = { 0, 0 };
    GHashTable * counters = g_hash_table_new_full(g_int_hash, g_int_equal, free, free);
    assert(counters);
    
    for ( i = 0; i < G_N_ELEMENTS(array); ++i ) {
        gpointer found = g_hash_table_lookup(counters, &(array[i]));
        if ( ! found ) 
            g_hash_table_insert(counters, dup_int(array[i]), dup_int(1));
        else 
            *(int*)found += 1;
    }
    
    g_hash_table_foreach(counters, find_max_value, &sp);
    
    printf("Array:\n");
    for ( i = 0; i < G_N_ELEMENTS(array); ++i )
        printf("%d ", array[i]);
    
    printf("\n--------------------\nValue\tCount\n--------------------\n");
    g_hash_table_foreach(counters, dump, (void*)separator);
    
    if ( sp.value == 1 )
        printf("All elements meets just once.\n");
    else
        printf("Most frequently (%d times) meets value of %d\n", sp.value, sp.key);
    
    g_hash_table_destroy(counters);
    exit(EXIT_SUCCESS);
}

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

В данном коде реализован алгоритм подсчета количества вхождений каждого элемента в одномерном массиве с использованием ассоциативного массива (hash-таблицы) и функции сравнения.

  1. В функции main определен одномерный массив array и инициализирован значениями {2, 1, 4, 6, 7, 6, 3, 3, 2, 0, 4, 4}.
  2. Создается структура данных PAIR, которая будет использоваться для хранения ключа и значения наибольшего элемента.
  3. Создается пустая hash-таблица counters с использованием функции g_hash_table_new_full, которая принимает функцию хеширования g_int_hash, функцию сравнения g_int_equal, функцию освобождения памяти для ключа free и функцию освобождения памяти для значения free.
  4. Происходит итерация по элементам массива. Для каждого элемента в массиве выполняется следующее:
    • Проверяется, есть ли элемент уже в hash-таблице. Если нет, то элемент добавляется в hash-таблицу с ключом равным самому элементу и значением равным 1.
    • Если элемент уже есть в hash-таблице, то значение этого элемента увеличивается на 1.
  5. Происходит итерация по элементам hash-таблицы с использованием функции g_hash_table_foreach и функции обратного вызова find_max_value, которая обновляет значения ключа и значения структуры sp в случае, если текущий элемент больше значения ключа и значения структуры sp.
  6. Выводится содержимое массива с помощью цикла for и функции printf.
  7. Выводится содержимое hash-таблицы с использованием функции g_hash_table_foreach, функции обратного вызова dump и строки-разделителя \t.
  8. Проверяется значение ключа и значения структуры sp. Если значение ключа равно 1, выводится сообщение All elements meets just once.. В противном случае выводится сообщение Most frequently (%d times) meets value of %d.
  9. Выполняется функция g_hash_table_destroy для освобождения памяти, занятой hash-таблицей.
  10. Программа завершается с успехом.

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


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

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

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