Удалить из массива все элементы, значение которых в этом массиве повторяются, оставив по одному - C (СИ)
Формулировка задачи:
Нужна помощь в написание кода программы: http://5.firepic.org/5/images/2013-10/22/wzca19sj8smg.png
Язык С.
Решение задачи: «Удалить из массива все элементы, значение которых в этом массиве повторяются, оставив по одному»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
void squeeze(int * array, size_t * count) {
int * pHead, * pTail;
for ( pHead = array; ( *count - ( pHead - array ) ) > 1; ++pHead ) {
for ( pTail = array + *count - 1; pTail > pHead; --pTail ) {
if ( *pTail == *pHead ) {
*count -= 1;
memmove(pTail, pTail + 1, sizeof(int) * ( *count - ( pTail - array ) ));
}
}
}
}
void dump(const int * array, size_t count) {
while ( count-- )
printf("%d%c", *array++, ( count ) ? ' ' : '\n');
}
int main(void) {
int randoms[20], same[5] = { 1, 1, 1, 1, 1 }, different[5] = { 1, 2, 3, 4, 5 };
size_t count;
srand(time(NULL));
for ( count = 0; count < 20; ++count )
randoms[count] = rand() % 10;
printf("Random elements\nBefore: ");
dump(randoms, count);
squeeze(randoms, &count);
printf("After: ");
dump(randoms, count);
count = 5;
printf("\nAll the same\nBefore: ");
dump(same, count);
squeeze(same, &count);
printf("After: ");
dump(same, count);
count = 5;
printf("\nAll the different\nBefore: ");
dump(different, count);
squeeze(different, &count);
printf("After: ");
dump(different, count);
return 0;
}
Объяснение кода листинга программы
- В функции
squeezeпроисходит удаление повторяющихся элементов из массива. - Переменная
pHeadинициализируется как указатель на первый элемент массива. - Переменная
pTailинициализируется как указатель на последний элемент массива. - В цикле
forперебираются все элементы массива, начиная сpHead, до тех пор, пока количество элементов в массиве больше 1. - В каждой итерации внутреннего цикла
for, проверяется, является ли текущий элемент массива (*pTail) равным элементу, на который указываетpHead. - Если элементы равны, то значение переменной
countуменьшается на 1, а память, выделенная под элементы, начиная сpTailи до конца массива, освобождается с помощью функцииmemmove. - В функции
dumpпроисходит вывод элементов массива на экран. - В функции
mainсоздаются массивыrandoms,sameиdifferentи заполняются случайными значениями. - Вызывается функция
squeezeдля удаления повторяющихся элементов из массиваrandoms. - Выводится на экран массив
randomsдо и после удаления повторяющихся элементов. - Вызывается функция
squeezeдля удаления повторяющихся элементов из массиваsame. - Выводится на экран массив
sameдо и после удаления повторяющихся элементов. - Вызывается функция
squeezeдля удаления повторяющихся элементов из массиваdifferent. - Выводится на экран массив
differentдо и после удаления повторяющихся элементов. - В конце программы возвращается 0, что означает успешное выполнение программы.