详细讲解:C语言删除数组中的某一值的所有元素

具体要求是这样的,通过键盘向程序输入数组中需要删除的数字,程序接到输入后删除数组中所有需要删除的数字。例如:

数组 a[10]={1,2,4,6,4,8,6,2,6,7}
删除数字 :6 
输出结果:1 2 4 4 8 2 7

想要实现这个功能,其基本思想其实很简单:检索数组,如果遇到与输入值相同的元素,则删除该元素。至于删除数组中的元素,就只需要把数组从中断处挨个往前移一位就好了。

但数组中要是出现多个相同的数字,就需要我们进行进一步的考虑了,元素的下标问题。
思路如下:
首先使用for循环对数组进行遍历,当遇到数组元素与需要删除的数字相同时,从该处起,将下标+1.假设我们输入的数字为:6,用for循环的变量i来遍历数组,则情况如下:

输入:x 为 6
下标  0 1 2 3 4 5 6 7 8 9     
元素  1 2 4 6 4 8 6 2 6 7
当i = 3 时,x = a[i] = 6,则数组a[10]从下标3开始,依次+1直到a[8](数组中第九个元素),即:

下标  0 1 2 3 4 5 6 7 8 | 9     i = 3
元素  1 2 4 4 8 6 2 6 7 | 7

可以看见数组中第一个6已经消失了,因为数组最高下标就是a[9],所以a[9] 不能再+1,因此我们的+1操作最多只加到a[8].
因为 a[9] 的值已经赋给了 a[8],所以a[9] 已经可以舍去(否则就会重复),所以目前数组中有效部分是a[0]-a[8]九个元素。

当i = 5 时,x = a[i] = 6,则数组a[10]从下标5开始,依次+1直到a[7](数组中第八个元素),即:

下标  0 1 2 3 4 5 6 7 | 8 9     i = 5
元素  1 2 4 4 8 2 6 7 | 7 7

数组中第二个6也消失了,数组的有效部分为a[0]-a[7]八个元素。

当i = 6 时,x = a[i] = 6,则数组a[10]从下标6开始,依次+1直到a[6](数组中第七个元素),即:

下标  0 1 2 3 4 5 6 | 7 8 9     i = 6
元素  1 2 4 4 8 2 7 | 7 7 7

至此,数组中的所有的6都已经被删除了,留下了从 a[0]到a[6] 七个有效元素。
因此我们打印时只需要打印前面7位就可以了,不难看见,减去的这几位正好是 “6” 出现的次数,因此我们只需要再设置一个标记,每次要求删除的数字出现时就自+1,最后输出时用数组长度减去这个标记数字,就能把有效的元素全部输出了。

转换成代码就是:

#include<stdio.h>
#include<string.h>
int main()
{ 
	int n,sum=0; //设置标记统计被删除数字的出现次数
	int a[10]={1,2,4,6,4,8,6,2,6,7};
	printf("\nthe array is:");
	for(int i=0;i<10;i++)
	{
		
		printf("%d",a[i]);   //遍历数组
	}
	printf("\nplease insert a number:");
	scanf("%d",&n);
	for(int i= 0;i<10;i++)
	{
		if(n==a[i])
		{	
			++sum;  //如出现,则下标自加1
			for(int j=i;j<10-sum;j++) //仅对有效部分元素进行自加
			{
				a[j]=a[j+1]; 
			}
		}
	}
	printf("the answer  is :\n");
	for(int i=0;i<10-sum;i++)  //仅输出有效部分
	{
		
		printf("%d",a[i]);
	}
}

这样就完成了。一开始做这个例子的时候总是输出不正确,后面自己按照程序运行过程写了一下就搞清楚了。所以有时候大家要是不知道为什么会出现莫名其妙的结果时,不妨试着自己画画图,很多就是就是一个数字的差别。

运行结果

虽然这个例题很简单,但我觉得要是把其中的细节弄明白,对我们以后的编程也是很有好处的,至少我觉得又提升了一些对程序的理解。细节决定成败,大家加油!

  • 15
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
删除数组中的重复元素,可以使用C语言编写一个算法来实现。具体的步骤如下: 1. 定义一个,接收一个整型组和组的大小作为参。 2. 在函内部,创建一个新的组,并将原组的第一个元素存入新数组中。 3. 使用两个嵌套的for循环来遍历原组。外层循环用于迭代原组的每个元素,内层循环用于比较当前元素与新数组中元素是否相同。如果相同,则跳过此元素;否则,将该元素添加到新组。 4. 返回新组。 下面是一个示例代码实现: ```c #include <stdio.h> int* removeDuplicates(int arr[], int size) { int* newArr = (int*)malloc(size * sizeof(int)); int newSize = 1; // 新组的大小,默认为1,即保留原组的第一个元素 newArr[0] = arr[0]; // 将原组的第一个元素存入新组 for (int i = 1; i < size; i++) { int isDuplicate = 0; for (int j = 0; j < newSize; j++) { if (arr[i] == newArr[j]) { isDuplicate = 1; break; } } if (isDuplicate == 0) { newArr[newSize] = arr[i]; newSize++; } } return newArr; } int main() { int arr[] = {1, 2, 3, 4, 2, 3, 5, 6, 1}; int size = sizeof(arr) / sizeof(arr[0]); int* newArr = removeDuplicates(arr, size); printf("原组:"); for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n删除重复元素后的组:"); for (int i = 0; i < newSize; i++) { printf("%d ", newArr[i]); } free(newArr); // 释放内存 return 0; } ``` 这段代码将会输出: ``` 原组:1 2 3 4 2 3 5 6 1 删除重复元素后的组:1 2 3 4 5 6 ``` 通过该算法,我们可以删除数组中的重复元素,并保留一个

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋昆昆昆伟easkwon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值