首页 > 解决方案 > 将未排序的 C 数组复制到另一个数组中,同时避免重复

问题描述

大家好,感谢您的宝贵时间。

作为练习,我想编写一个程序,将所有元素从一个数组复制到另一个数组,但没有重复项。唯一的条件是我无法更改原始数组 - 所以没有排序。

我尝试制作一个函数来检查是否在我们复制到的数组(array2)中找到了array1 的当前元素。如果不是,我们然后将元素复制到第二个数组并将大小增加一

但是,它不起作用:

如果我有

int array1[15] = {3,2,4,7,9,1,4,6,7,0,1,2,3,4,5};
int array2[15];

array2应包含以下数字:3,2,4,7,9,1,6,0,5

但我的输出如下:3,2,4,7,9,1,6

这是代码:

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

int already_exists(int array2[], int size_arr2, int element)
{

    int i;

    for(i=0; i<size_arr2; i++)
    {
        if(array2[i] == element)
            return 1;
    }
    return 0;
}

int main()
{
    int array1[15] = {3,2,4,7,9,1,4,6,7,0,1,2,3,4,5};
    int array2[15];
    int i;
    int size_arr2=0;

    for(i=0; i<9; i++)
    {
        int element = array1[i];

        if(already_exists(array2, size_arr2, element) == 1)
            continue;
        else
        {
            array2[size_arr2] = element;
            size_arr2++;
        }
    }

    for(i=0; i<size_arr2; i++)
    {
        printf("%d, ", array2[i]);
    }
    return 0;
}

标签: carrayscopyunique

解决方案


你在 for 循环中有错字

for(i=0; i<9; i++)

该数组array1包含 15 个元素。所以循环应该看起来像

for ( i = 0; i < 15; i++ )

错误的原因是您使用的是“幻数”而不是命名常量。

然而,整个程序效率低下,因为该函数already_exists是为数组的每个元素调用的array1。至少您可以将其声明为内联函数。

此外,它应该声明为

int already_exists( const int array2[], size_t size_arr2, int element );

而不是这个函数,最好编写一个执行完整操作的函数。

这是一个演示程序。

#include <stdio.h>

size_t copy_unique( const int a1[], size_t n1, int a2[] )
{
    size_t n2 = 0;

    for ( size_t i = 0; i < n1; i++ )
    {
        size_t j = 0;
        while ( j < n2 && a2[j] != a1[i] ) j++;

        if ( j == n2 ) a2[n2++] = a1[i];
    }

    return n2;
}

int main(void) 
{
    enum { N = 15 };
    int array1[N] = { 3, 2, 4, 7, 9, 1, 4, 6, 7, 0, 1, 2, 3, 4, 5 };
    int array2[N];

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

    size_t n2 = copy_unique( array1, N, array2 );

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

    return 0;
}

它的输出是

3 2 4 7 9 1 4 6 7 0 1 2 3 4 5 
3 2 4 7 9 1 6 0 5 

推荐阅读