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

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

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

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

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <glib.h>
  5.  
  6. int * dup_int(const int n) {
  7.     int * p = malloc(sizeof(int));
  8.     assert(p);
  9.     *p = n;
  10.    
  11.     return p;
  12. }
  13.  
  14. void dump(void * key, void * value, void * user_data) {
  15.     printf("%d%s%d\n", *(int*)key, (const char*)user_data, *(int*)value);
  16. }
  17.  
  18. struct PAIR {
  19.     int key;
  20.     int value;
  21. };
  22.  
  23. void find_max_value(void * key, void * value, void * user_data) {
  24.     struct PAIR * sp = (struct PAIR*) user_data;
  25.     int * k = (int*)key;
  26.     int * v = (int*)value;
  27.    
  28.     if ( *v > sp->value ) {
  29.         sp->key = *k;
  30.         sp->value = *v;
  31.     }
  32. }
  33.  
  34. const char * separator = "\t";
  35.  
  36. int main(void) {
  37.     int array[] = { 2, 1, 4, 6, 7, 6, 3, 3, 2, 0, 4, 4 }, i;
  38.     struct PAIR sp = { 0, 0 };
  39.     GHashTable * counters = g_hash_table_new_full(g_int_hash, g_int_equal, free, free);
  40.     assert(counters);
  41.    
  42.     for ( i = 0; i < G_N_ELEMENTS(array); ++i ) {
  43.         gpointer found = g_hash_table_lookup(counters, &(array[i]));
  44.         if ( ! found )
  45.             g_hash_table_insert(counters, dup_int(array[i]), dup_int(1));
  46.         else
  47.             *(int*)found += 1;
  48.     }
  49.    
  50.     g_hash_table_foreach(counters, find_max_value, &sp);
  51.    
  52.     printf("Array:\n");
  53.     for ( i = 0; i < G_N_ELEMENTS(array); ++i )
  54.         printf("%d ", array[i]);
  55.    
  56.     printf("\n--------------------\nValue\tCount\n--------------------\n");
  57.     g_hash_table_foreach(counters, dump, (void*)separator);
  58.    
  59.     if ( sp.value == 1 )
  60.         printf("All elements meets just once.\n");
  61.     else
  62.         printf("Most frequently (%d times) meets value of %d\n", sp.value, sp.key);
  63.    
  64.     g_hash_table_destroy(counters);
  65.     exit(EXIT_SUCCESS);
  66. }

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

В данном коде реализован алгоритм подсчета количества вхождений каждого элемента в одномерном массиве с использованием ассоциативного массива (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

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

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

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