使用C语言从数组中删除重复项

时间:2019-06-17 13:33:28

标签: c arrays algorithm sorting unique

从排序数组中删除重复项

#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 个答案:

答案 0 :(得分:4)

您没有初始化变量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 :(得分:1)

您的代码和逻辑是正确的。但是您没有初始化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;
}