Печать уникальных значений массива в C - PullRequest
2 голосов
/ 20 июня 2020

Я написал функцию, создающую динамический c массив случайных значений, и другую функцию, создающую новый массив, состоящий из уникальных значений предыдущего массива. Используемый алгоритм правильно подсчитывает уникальные значения. Однако я столкнулся с проблемой печати всех значений. В приведенном ниже примере программа напечатала 7 2 12714320 4 5 вместо 7 2 4 5 6.

Это программа, которую можно протестировать:

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

int *delduplicate(int *v, int size_old, int *size_new);

main()
{
    int n;
    int *norepeat;
    float *results;
    int dim, size_norepeat, i;
    
    int a[7] = {7,2,2,4,5,6,7};
    
    norepeat = delduplicate(a, 7, &size_norepeat);
    
    for (int i = 0; i < size_norepeat; i++)
        printf("%d ", norepeat[i]);
}



// delduplicate function
int *delduplicate(int *v, int size_old, int *size_new)
{
    int i, j, k = 1, uniques = 1, repeats, *new_v, temp;
    
    // count the number of unique elements
    for (i = 1; i < size_old; i++)
    {
        int is_unique = 1;
        
        for (j = 0; is_unique && j < i; j++)
        {
            if (v[i] == v[j])
                is_unique = 0;          
        }
        
        if (is_unique)
            uniques++;
    }
    
    *size_new = uniques;
    
    // create new array of unique elements
    new_v = (int*) malloc(*size_new * sizeof(int));
    
    // fill new array with unique elements
    new_v[0] = v[0];
    
    for (i = 1; i < size_old; i++)
    {
        int is_unique = 1;
            
        for (j = 0; j < i; j++)
        {
            if (v[i] == v[j])
                is_unique = 0;
        }
    
        if (is_unique)
            new_v[k] = v[i];
            k++;
            
    }
    return new_v;
}

Проблема должна возникать здесь:

// fill new array with unique elements
new_v[0] = v[0];

for (i = 1; i < size_old; i++)
{
    int is_unique = 1;
        
    for (j = 0; j < i; j++)
    {
        if (v[i] == v[j])
            is_unique = 0;
    }

    if (is_unique)
        new_v[k] = v[i];
        k++;       
}

1 Ответ

3 голосов
/ 20 июня 2020

Вероятно, ваша проблема возникает в следующем разделе -

if (is_unique)
    new_v[k] = v[i];
    k++;

Здесь вы увеличиваете k на каждой итерации. Однако вы хотите увеличивать его только всякий раз, когда найдете уникальный элемент. if() без скобок рассматривает только первое утверждение. Так что измените его на это -

if (is_unique){
    new_v[k] = v[i];
    k++;
}

Это изменение должно заставить вашу программу работать нормально.

Боковое примечание: Если вы не хотите использовать скобки для if(), for(), и т.д. c, вы можете разделить операторы запятыми и использовать без скобок. Вот так -

if (is_unique)
    new_v[k] = v[i],
    k++;
...