Удалить из массива все элементы, значение которых в этом массиве повторяются, оставив по одному - 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;
}

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

  1. В функции squeeze происходит удаление повторяющихся элементов из массива.
  2. Переменная pHead инициализируется как указатель на первый элемент массива.
  3. Переменная pTail инициализируется как указатель на последний элемент массива.
  4. В цикле for перебираются все элементы массива, начиная с pHead, до тех пор, пока количество элементов в массиве больше 1.
  5. В каждой итерации внутреннего цикла for, проверяется, является ли текущий элемент массива (*pTail) равным элементу, на который указывает pHead.
  6. Если элементы равны, то значение переменной count уменьшается на 1, а память, выделенная под элементы, начиная с pTail и до конца массива, освобождается с помощью функции memmove.
  7. В функции dump происходит вывод элементов массива на экран.
  8. В функции main создаются массивы randoms, same и different и заполняются случайными значениями.
  9. Вызывается функция squeeze для удаления повторяющихся элементов из массива randoms.
  10. Выводится на экран массив randoms до и после удаления повторяющихся элементов.
  11. Вызывается функция squeeze для удаления повторяющихся элементов из массива same.
  12. Выводится на экран массив same до и после удаления повторяющихся элементов.
  13. Вызывается функция squeeze для удаления повторяющихся элементов из массива different.
  14. Выводится на экран массив different до и после удаления повторяющихся элементов.
  15. В конце программы возвращается 0, что означает успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5
Похожие ответы