在C中创建一个没有重复整数的新数组

时间:2018-05-10 11:39:02

标签: c arrays

我被要求创建一个没有来自数组的重复整数的新数组。

我认为我在代码中犯了一个错误,但却没有发现任何错误。

" 1,2,1,2,1,4和34的输出;是" 1,2,2,4"。

它应该是" 1,2,4"

想了解我的错误。

    // Exercise 2 - 
void Ex2() {
    int i, counter = 1, size = -1;
    int* array = input_dynamic_array(&size);
    int* newArr = (int*)malloc((size)* sizeof(int));
    newArr[0] = array[0];
    assert(array);
    for (i = 1; i < size; i++) {
        if (!find_num_in_newArr(newArr, size, array[i])) {
            newArr[counter++] = array[i];
        }
    }
    newArr = (int*)realloc(newArr, (counter)*sizeof(int));
    printArray(newArr, counter);
    free(array);
    free(newArr);
}

bool find_num_in_newArr(int *newArr, int size, int num) {
    int i;
    for (i = 0; i < size; i++) {
        if (newArr[i] == num) {
            return true;
        }
        return false;
    }
}

int* input_dynamic_array(int *size)
{
    int *array;
    int ii;
    printf("Enter array size: ");
    scanf("%d", size);
    array = (int*)malloc((*size) * sizeof(int));
    assert(array);
    printf("Enter %d integer numbers: ", *size);
    for (ii = 0; ii < *size; ii++)
        scanf("%d", array + ii);
    return array;
}

3 个答案:

答案 0 :(得分:4)

我在这里看到一个问题:

for (i = 0; i < size-1; i++) 
{
    if (newArr[i] == num) 
    {
        return true;
    }
    return false;
}

这将永远不会有另一次迭代。它将从第一次迭代返回truefalse。这不是你在使用循环时计划的内容。

根据您的设计,您可能希望将return false;移出循环。

另一个建议,Don't cast the return value of malloc, its pointless

另外,

int* newArr = (int*)malloc((size)* sizeof(int));

这需要进行检查。您需要检查malloc是否返回NULL。如果是,则不分配内存,并且基于newArr进行修改的任何内容都会非常糟糕。

相对更干净的方法包括使用如下所示的函数:

int RemoveDuplicates(int* Arr, int length)
{
    int i = 0, j = 0;
    int LengthChanged = 0;

    for (i = 1; i < length; i++)
    {
        for(j = 0; j < LengthChanged ; j++)
        {
            if(Arr[i] == Arr[j])
                break;
        }

        // Copy as is if there is not duplicate element in the array
        if (j == LengthChanged )
            Arr[LengthChanged++] = Arr[i];
    }

    return LengthChanged;
}

答案 1 :(得分:3)

您的代码中存在两个问题:

  • find_num_in_newArr在第一次迭代时以return false;退出循环。将return语句移到循环体外。
  • Ex2检查整个数组是否有重复项,而不仅仅是已复制的部分:find_num_in_newArr(newArr, size, array[i])应为find_num_in_newArr(newArr, i, array[i])。如发布,此代码具有未定义的行为。

这是一个带有一些额外断言的更正版本:

// Exercise 2 - 
bool find_num_in_newArr(const int *newArr, int size, int num) {
    int i;
    for (i = 0; i < size; i++) {
        if (newArr[i] == num) {
            return true;
        }
    }
    return false;
}

int *input_dynamic_array(int *size) {
    int *array;
    int ii;
    printf("Enter array size: ");
    assert(scanf("%d", size) == 1);
    assert(*size > 0);
    array = (int*)malloc((*size) * sizeof(int));
    assert(array != NULL);
    printf("Enter %d integer numbers: ", *size);
    for (ii = 0; ii < *size; ii++) {
        assert(scanf("%d", array + ii) == 1);
    }
    return array;
}

void Ex2(void) {
    int i, counter, size;
    int *array = input_dynamic_array(&size);
    int *newArr = (int*)malloc(size * sizeof(int));
    assert(newArr != NULL);
    newArr[0] = array[0];
    counter = 1;
    for (i = 1; i < size; i++) {
        if (!find_num_in_newArr(newArr, i, array[i])) {
            newArr[counter++] = array[i];
        }
    }
    newArr = (int*)realloc(newArr, counter * sizeof(int));
    assert(newArr != NULL);
    printArray(newArr, counter);
    free(array);
    free(newArr);
}

答案 2 :(得分:0)

你有点复杂了。 为索引使用正确的类型(size_t

int CheckValue(int *arr, int value, size_t size)
{
    while (size--)
    {
        if (arr[size - 1] == value) return -1;
    }
    return 0;
}

int main()
{
    int arr[] = {1,4,5,8,3,2,1,-1,9,-1,-1,6,8,1,5,4,2,3};
    int newarr[sizeof(arr) / sizeof(arr[0])];
    size_t size = 0;

    for (size_t index = 0; index < sizeof(arr) / sizeof(arr[0]); index++)
    {
        if (!CheckValue(newarr, arr[index], size))
        {
            newarr[size++] = arr[index];
        }
    }
    return 0;
}