Удаление дублирующихся элементов из массива с использованием языка Си - PullRequest
2 голосов
/ 17 июня 2019

Удаление повторяющихся элементов из отсортированного массива

#include <stdio.h>
#include <stdlib.h>

int main() {
    int arr[12] = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5 };
    int temp[12];
    int i, j, k, n = 12;

    for (i = 0; i < n - 1; i++) {
        if (arr[i] != arr[i + 1]) {
            temp[j] = arr[i];
            j++;
        }
    }

    temp[j] = arr[n - 1];

    for (k = 0; k <= j; k++) {
        printf("%d\n", temp[k]);
    }

    return 0;
}

Вывод:

6356652
1955753237
1956070172
6356716
1955750536
8
1955687363
1955687354
1
2
3
4
5

Process returned 0 (0x0)   execution time : 0.014 s
Press any key to continue.

Я не хочу, чтобы эти числа выводились на печать:

6356652
1955753237
1956070172
6356716
1955750536
8
1955687363
1955687354

Ответы [ 2 ]

4 голосов
/ 17 июня 2019

Вы не инициализировали переменную j.Поэтому использование неинициализированной переменной вызывает неопределенное поведение.

Лучше сформировать массив без дубликатов в одном цикле, а не разбивать цикл на цикл и еще один оператор после цикла.

Выможно написать отдельную функцию, например, следующим образом, как показано в демонстрационной программе.

#include <stdio.h>

size_t remove_copy( const int a[], int b[], size_t n )
{
    size_t j = 0;

    for ( size_t i = 0; i < n; i++ )
    {
        if ( i == 0 || a[i] != b[j-1] ) b[j++] = a[i];
    }

    return j;
}

int main(void) 
{
    int a[] = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5 };
    int b[sizeof( a ) / sizeof( *a )];
    const size_t N = sizeof( a ) / sizeof( *a );

    for ( size_t i = 0; i < N; i++ ) printf( "%d ", a[i] );
    putchar( '\n' );

    size_t n = remove_copy( a, b, N );

    for ( size_t i = 0; i < n; i++ ) printf( "%d ", b[i] );
    putchar( '\n' );

    return 0;
}

Вывод программы:

1 2 2 3 3 3 4 4 4 4 5 5 
1 2 3 4 5 
1 голос
/ 27 июня 2019

Ваш код и логика верны. Но вы сделали ошибку, не инициализировав j = 0. Из-за этого вы получали некоторые бредовые ценности. Итак, я исправил и выполнил его и получил правильный ответ.

#include <stdio.h>

int main() {
    int arr[12] = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5 };
    int temp[12];
    int i, j = 0, k, n = 12;

    for (i = 0; i < n - 1; i++) {
        if (arr[i] != arr[i + 1]) {
            temp[j] = arr[i];
            j++;
        }
    }

    temp[j] = arr[n - 1];

    for (k = 0; k <= j; k++) {
        printf("%d\n", temp[k]);
    }

    return 0;
}
...