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