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