用于从c

时间:2017-01-25 07:10:24

标签: c arrays

我试图编写一个从数组中删除重复值的程序。我已经部分设法这样做,因为我的程序能够删除数组中重复TWICE的任何一个数字。 所以问题是,如果一个数字重复三次,只删除其中一个数字,即其他两个仍然留在数组中,如果重复多个数字,即使只有第一个数字也是如此数组已被删除。我真的无法理解我的代码有什么问题,为什么它无法删除重复两次以上的数字。我已经就此问题浏览了互联网,虽然我有不同的方法删除重复的元素,但我仍然不知道我的代码有什么问题。

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

int dup(int [],int);
int main() 
{
    int i,n,index,a[20];
    printf("Enter n value \n");
    scanf("%d",&n);
    printf("Enter array values \n");
    for(i=0;i<n;++i)
        scanf("%d",&a[i]);
    for(i=0;i<n;++i)
    {
        index=dup(a,n);
        if(index==-1)
        {
            printf("No duplicate elements");
            break;
        }
        else
        {
            a[index]=0;
            for(i=index;i<n;i++)
                a[i]=a[i+1];
            n-=1;
        }
    }
    printf("Output: \n");
    for(i=0;i<n;++i)
        printf("%d\n",a[i]);

    return (EXIT_SUCCESS);
}
int dup(int a[],int size)
{
    int i,j,pos=-1;
    for(i=0;i<size;i++)
    {
        for(j=i+1;j<size;j++)
        {
            if(a[i]==a[j])
            {
                pos=j;
                return pos;
            }
        }
    }
    if(pos==-1)
        return pos;
}

输出

  

输入n值

     

5

     

输入数组值

     

12

     

24

     

3

     

12

     

24

     

输出:

     

12

     

24

     

3

     

24

显然无法删除其他重复元素&#34; 24&#34;。此外,如果一个数字重复三次,则只会删除其中一个数字。

4 个答案:

答案 0 :(得分:2)

for(i=0;i<n;++i)  // <-------------------------------------- for i
{
    index=dup(a,n);
    if(index==-1)
    {
        printf("No duplicate elements");
        break;
    }
    else
    {
        a[index]=0;
        for(i=index;i<n;i++) // <--------------------------- for i
            a[i]=a[i+1];
        n-=1;
    }
}

您正在为两个循环使用相同的循环变量,一个嵌套在另一个循环中。这不行。使用不同的变量。 Live demo

答案 1 :(得分:0)

我的错误,一开始我认为你在运行它之后n遇到了问题。

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

int dup(int [],int);
int main()
{
    int i,n,index,a[20], count;
    printf("Enter n value \n");
    scanf("%d",&n);
    count = n;
    int j;
    printf("Enter array values \n");
    for(i=0;i<n;++i)
        scanf("%d",&a[i]);
    for(i=0;i<n;++i)
    {
        index=dup(a,n);
        if(index==-1)
        {
            printf("No duplicate elements");
            break;
        }
        else
        {
            a[index]=0;
            for(j=index;j<n;j++)
                a[j]=a[j+1];
            n-=1;
        }
    }
    printf("Output: \n");
    for(i=0;i<n;++i)
        printf("%d\n",a[i]);

    return (EXIT_SUCCESS);
}
int dup(int a[],int size)
{
    int i,j,pos=-1;
    for(i=0;i<size;i++)
    {
        for(j=i+1;j<size;j++)
        {
            if(a[i]==a[j])
            {
                pos=j;
                return pos;
            }
        }
    }
    if(pos==-1)
        return pos;
}

输出

  

输入n值

     

5

     

输入数组值

     

12

     

24

     

3

     

12

     

24

     

输出:

     

12

     

24

     

3

答案 2 :(得分:0)

  

问题似乎在于第二个循环中的if条件。

for (k = j; k < size; k++) {
           arr[k] = arr[k + 1];
        }
  

只需将这段代码放在if条件

之后
if(a[i]==a[j])
  

它会起作用。

答案 3 :(得分:0)

你应该更好地命名你的迭代器变量,这样你就不会在嵌套循环中混淆它们,或者像你一样,在嵌套循环中使用相同的两次。 这会在您第一次删除后跳过所有变量。

你不必这样做

if(pos==-1)
    return pos;

跳过if,因为没有必要,如果在这个位置pos不是-1那么你就没有回报,我想是UB。