从C中的数组中删除重复的整数

时间:2012-03-26 22:48:48

标签: c arrays

我正在开发一个程序,通过对数组进行排序然后删除重复的连续值来从数组中删除重复值。首先,我执行选择排序排序方法,然后调用修改数组并返回大小的函数removedup()。然后我基本上将数组中的值打印到该大小。但是,当我执行它时,它只打印原始数组,然后打印一堆空格。有谁知道为什么会这样?

我的代码:http://pastebin.com/uTTnnMHN

只是重复数据删除代码:

int removedup(int a[])
{
    int i, count, j;
    count = n;
    for (i = 0; i < (n - 1); i++) {
        if (a[i] == a[i + 1]) {
            for (j = 0; j < (n - i); j++) {
                a[j] = a[j + 1];
            }
            count--;
            i--;
        }
    }
    return count;
}

6 个答案:

答案 0 :(得分:2)

-1表示(j = 0; j&lt;(n-i); j ++)

你的循环是否向左移动你的数组(从而删除了重复的值),j不应该是init到j而是i,并且条件似乎不正确

正确的可能是:

for(j=i;j<n-1;j++)
{
   a[j]=a[j+1];
}
a[n-1] = 0; // Because you shift your table to the left, the last value should not be used

答案 1 :(得分:1)

首先如果i = 0并且如果a [i] == a [i + 1]那么i = -1

for(i=0;i<(n-1);i++)
 {
      if(a[i]==a[i+1])
      {                       
          for(j=0;j<(n-i);j++)
          {
              a[j]=a[j+1];
          }
          count--;
          i--;  //i=-1  if(a[i]==a[i+1]) && if(i==0)
      }
 }

答案 2 :(得分:1)

在你的重复删除功能中,你需要在i开始移动循环,如前所述,你必须使用count - 1作为两个循环的循环绑定,否则你将拥有每当有重复时,无限循环,因为a[n-2] == a[n-1]总是在第一个移动循环之后。

int removedup(int a[])
{
    int i, count, j;
    count = n;
    for(i = 0; i < (count-1); i++)
    {
        if(a[i] == a[i+1])
        {

            for(j = i; j < (count-1); j++)
            {
                a[j]=a[j+1];
            }
            count--;
            i--;
        }
    }
    return count;
}

正常工作。

答案 3 :(得分:0)

既然您正在创建另一个阵列,为什么不简化您的功能呢?

int removedup(int a[], int b[])
{
    int i;
    int count = 1;
    b[0] = a[0]


    for(i=1;i<(n-1);i++){
        if(a[i-1] != a[i]){
            b[count++] = a[i];
        }
    }
    return count;                          
}

然后当你调用该函数时,

count=removedup(a, OutArray);

答案 4 :(得分:0)

int removedup(int a[])
{
    int i;
    count = n;
    for (i = 0; i < (count-1); ++i) {
        if (a[i] == a[i+1]) { /* found a duplicate */
            int d = 0; /* count the duplicates */
            do {
                ++d;
            } while ((i+1+d) < count && a[i] == a[i+1+d]); /* probe ahead again for a duplicate */

            /* at this point we have either run out of duplicates or hit the end of the array */
            if ((i+1+d) < count)
                memmove(&a[i+1], &a[i+1+d], sizeof(int)*(count-(i+1+d))); /* shift down rest of the array if there's still elements to look at */ 
            count -= d; /* adjust the count down by the number of duplicates */
        }
    }
    return count;
 }

答案 5 :(得分:0)

这个怎么样,没有排序但是遍历。最后打印数组的有效值并返回它的大小。

int removedup(int a[])
{
    int i, count, j;
    count = n;
    int b[n];
    memset(b,0,sizeof(b));
    for (i = 0; i < (n - 1); i++) 
    {
        if (-1 != b[i])
        {
            for(j=i+1;j<n-1;j++)
            {
                if( a[i]==a[j])
                {
                    b[j]=-1;
                    count--;
                }
            }
        }
    }
    for(i=0;i<n-1;i++)
    {
        if(-1 != b[i])
        {
            printf("%d ",a[i]);
        }
    }
    return count;
}