Найти одинаковые элементы в одномерном массиве - 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-таблицей
. - Программа завершается с успехом.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д