C语言。删去一维数组中所有相同的数,使之只剩一个。程序如下求改错。

/* 请编写函数fun,函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大
的顺序排列,函数返回删除后数组中数据的个数。
例如,一维数组中的数据是:
2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10。删除后数组中的内容应该是:2 3 4 5 6 7 8 9 10。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
*/

#include <stdio.h>
#define N 80

int fun(int a[], int n)
{int i,k,s;
s=n;
for(i=0;i<n;i++)
{
if(a[i]==a[i+1])
for(k=i;k<n;k++)
a[k]=a[k+1];
s--;}
return s;
}

void main()
{ int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20;
printf("The original data :\n");
for(i=0; i<n; i++)
printf("%3d",a[i]);
n=fun(a,n);
printf("\n\nThe data after deleted :\n");
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n\n");

}

他这个是有错误的,222最后会变成22,只有再把他那个fun里的实现方法在复制一遍才可以消除。因为你看a[]={2,2,2,3};的话,a[0]==a[1]判断,成立,a[0]=a[1]依次赋值过去。可是再往后i已经变成2,再往后是a[2]==a[3]的判断,也就是2==3,显然不成立,所以保留了两个相邻的2。即结果等于a[]={2,2,3}.
解决方法是再次的复制这个for语句下,就OK了。
#include <stdio.h>
#define N 80
int fun(int a[], int n)
{int i,k,s;
s=n;
for(i=0;i<n;i++)
{
if(a[i]==a[i+1])
{
for(k=i;k<n;k++)
a[k]=a[k+1];
s--;
}
}
for(i=0;i<n;i++)
{
if(a[i]==a[i+1])
{
for(k=i;k<n;k++)
a[k]=a[k+1];
s--;
}
}
return s;
}
void main()
{ int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20;
printf("The original data :\n");
for(i=0; i<n; i++)
printf("%3d",a[i]);
n=fun(a,n);
printf("\n\nThe data after deleted :\n");
for(i=0;i<20;i++)
printf("%3d",a[i]);
printf("\n%d\n",n);

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-12-16
for(i=0;i<n;i++) /*修改:此处改成i<n-1*/
{
if(a[i]==a[i+1]) /*错误:c从0~n-1取值,此处i+1已越界了*/
for(k=i;k<n;k++) /*修改:此处改成k<n-1*/
a[k]=a[k+1]; /*错误:c从0~n-1取值,此处k+1已越界了*/
由于a[k]=a[k+1]; 保证了最后一位已经移到前面,因此修改的地方,不会发生漏选错误。本回答被提问者采纳
第2个回答  2011-12-22
你的算法错误,我帮你修改如下!
我的算法比较简单,你仔细跟踪下便知。

int fun(int a[], int n)
{
int i, k, s;

s = n;
for(i = 0, k = 0; i < n - 1; i++)
{
for(NULL; k++, k < n; NULL) //把k++放在条件处,因为if 和else共用
{
if(a[i] == a[k])
s--;
else
{
a[i + 1] = a[k];
break;
} //else
}//for
}//for

return s;
}
第3个回答  2011-12-22
int fun(int a[], int n)
{
int i,k=0;
int b[N];
b[0]=a[0];
for(i=1;i<n;i++)
if(b[k]==a[i])
continue;
else
b[k++]=a[i];
for(i=0;i<=k;i++)
a[i]=b[i];
return k+1;
}
相似回答