我试图编写一个从数组中删除重复值的程序。我已经部分设法这样做,因为我的程序能够删除数组中重复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;。此外,如果一个数字重复三次,则只会删除其中一个数字。
答案 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。