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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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");

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]; 保证了最后一位已经移到前面,因此修改的地方,不会发生漏选错误。
参考技术A 他这个是有错误的,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);

参考技术B 你的算法错误,我帮你修改如下!
我的算法比较简单,你仔细跟踪下便知。

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;
参考技术C 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;

删除数组中重复的元素

请编写函数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。

#include<stdio.h>
int fun(int a[],int n)

	int i=0;
	int j=0;
	int t=-999;     //定义一个比数组第一个元素值小的值
	while(j<n)
	
		if(a[j]>t)
		
			a[i]=a[j];
			t=a[i];
			i++;
		
		j++;
	
	return i;       //返回删除后数组的元素个数

int main()
	int a[]=2 ,2 ,2 ,3 ,4 ,4 ,5 ,6 ,6 ,6 ,6 ,7 ,7 ,8 ,9 ,9 ,10, 10, 10;
	int i;
	int j=0;
	int n=19;
	i=fun(a,n);
	while(j<i)
	
		printf("%d ",a[j]);
		j++;
	

以上是关于C语言。删去一维数组中所有相同的数,使之只剩一个。程序如下求改错。的主要内容,如果未能解决你的问题,请参考以下文章

删除一维数组中所有相同的数,使之只剩下一个,数组中的数已按由小到大顺序排列。

删除数组中重复的元素

如何将一个一维数组中的所有数都赋值为-1?不用循环。

如何在一个一维数组中插入一个和删除一个数

Java 怎样删除一维数组中值为M的元素

C语言中怎么把一维数组赋给另外一个一维数组