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

2023-10-19 21:50

本文主要是介绍详细讲解: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;  //如出现,则下标自加1for(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]);}
}

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

运行结果

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

这篇关于详细讲解:C语言删除数组中的某一值的所有元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/242597

相关文章

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

SQL Server中行转列方法详细讲解

《SQLServer中行转列方法详细讲解》SQL行转列、列转行可以帮助我们更方便地处理数据,生成需要的报表和结果集,:本文主要介绍SQLServer中行转列方法的相关资料,需要的朋友可以参考下... 目录前言一、为什么需要行转列二、行转列的基本概念三、使用PIVOT运算符进行行转列1.创建示例数据表并插入数

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

C#实现插入与删除Word文档目录的完整指南

《C#实现插入与删除Word文档目录的完整指南》在日常的办公自动化或文档处理场景中,Word文档的目录扮演着至关重要的角色,本文将深入探讨如何利用强大的第三方库Spire.Docfor.NET,在C#... 目录Spire.Doc for .NET 库:Word 文档处理利器自动化生成:C# 插入 Word

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免