如何在C语言数组中删除某个数
创作时间:
作者:
@小白创作中心
如何在C语言数组中删除某个数
引用
1
来源
1.
https://docs.pingcode.com/baike/1291060
要从C语言数组中删除某个数,可以使用多种方法,例如创建一个新数组、使用循环遍历和条件判断等。本文将详细介绍几种有效的方法:创建新数组、覆盖法、递归法。以下详细描述了覆盖法。
覆盖法:遍历数组,找到目标元素后,将其后的每个元素向前移动一个位置,最后减小数组的有效大小。
一、覆盖法
1. 概述
覆盖法是通过遍历数组,找到需要删除的元素,然后将后续元素依次前移一个位置,覆盖掉被删除的元素。这种方法简单高效,适合大多数情况下的数组元素删除操作。
2. 实现步骤
- 初始化一个指针或索引,从数组的开始位置开始遍历。
- 检查当前元素是否为目标元素。
- 如果是目标元素,将其后的每个元素向前移动一个位置。
- 更新数组的有效大小。
- 重复以上操作直到遍历完数组。
3. 示例代码
#include <stdio.h>
// Function to remove a specific element from an array
void removeElement(int arr[], int *size, int element) {
int i, j;
for (i = 0; i < *size; i++) {
if (arr[i] == element) {
// Shift elements to the left
for (j = i; j < *size - 1; j++) {
arr[j] = arr[j + 1];
}
(*size)--;
i--; // Adjust index to check new element at current index
}
}
}
int main() {
int arr[] = {1, 2, 3, 4, 3, 5, 6};
int size = sizeof(arr) / sizeof(arr[0]);
int element = 3;
printf("Original array: ");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
removeElement(arr, &size, element);
printf("Array after removing %d: ", element);
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
二、创建新数组法
1. 概述
创建一个新数组法是通过创建一个新的数组,将原数组中所有不等于目标元素的值复制到新数组中。这种方法会增加额外的空间开销,但代码逻辑更加清晰,容易理解。
2. 实现步骤
- 创建一个新数组,大小与原数组相同。
- 初始化一个索引指针,指向新数组的起始位置。
- 遍历原数组,将所有不等于目标元素的值复制到新数组中。
- 结束遍历后,新数组即为去掉目标元素的数组。
3. 示例代码
#include <stdio.h>
#include <stdlib.h>
// Function to remove a specific element from an array using a new array
int* removeElementNewArray(int arr[], int size, int element, int* newSize) {
int* newArr = (int*)malloc(size * sizeof(int));
int j = 0;
for (int i = 0; i < size; i++) {
if (arr[i] != element) {
newArr[j++] = arr[i];
}
}
*newSize = j;
return newArr;
}
int main() {
int arr[] = {1, 2, 3, 4, 3, 5, 6};
int size = sizeof(arr) / sizeof(arr[0]);
int element = 3;
int newSize;
printf("Original array: ");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
int* newArr = removeElementNewArray(arr, size, element, &newSize);
printf("Array after removing %d: ", element);
for (int i = 0; i < newSize; i++) {
printf("%d ", newArr[i]);
}
printf("\n");
free(newArr); // Free allocated memory
return 0;
}
三、递归法
1. 概述
递归法通过递归调用自身的方式来遍历数组并删除目标元素。这种方法适合处理一些需要递归思路的问题,但对于简单的数组删除操作,效率和简洁性可能不如前两种方法。
2. 实现步骤
- 定义一个递归函数,接受数组、当前索引、数组大小和目标元素作为参数。
- 在递归函数中,检查当前元素是否为目标元素。
- 如果是目标元素,将其后的每个元素向前移动一个位置,并递归调用函数。
- 如果不是目标元素,递归调用函数处理下一个元素。
- 递归结束后,返回处理后的数组。
3. 示例代码
#include <stdio.h>
// Recursive function to remove a specific element from an array
void removeElementRecursive(int arr[], int *size, int element, int index) {
if (index >= *size) {
return;
}
if (arr[index] == element) {
for (int i = index; i < *size - 1; i++) {
arr[i] = arr[i + 1];
}
(*size)--;
removeElementRecursive(arr, size, element, index); // Check the current index again
} else {
removeElementRecursive(arr, size, element, index + 1); // Move to next index
}
}
int main() {
int arr[] = {1, 2, 3, 4, 3, 5, 6};
int size = sizeof(arr) / sizeof(arr[0]);
int element = 3;
printf("Original array: ");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
removeElementRecursive(arr, &size, element, 0);
printf("Array after removing %d: ", element);
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
四、对比分析
1. 覆盖法
覆盖法的优点在于不需要额外的空间,可以直接在原数组上进行操作,适合数组较小且频繁进行删除操作的场景。然而,当目标元素较多时,频繁的元素移动可能导致性能下降。
2. 创建新数组法
创建新数组法的优点在于逻辑清晰,代码易于维护,适合需要保留原数组或进行复杂操作的场景。缺点在于需要额外的空间,可能导致内存消耗增加。
3. 递归法
递归法适合处理需要递归思路的问题,但对于简单的数组删除操作,递归法的代码复杂度较高,性能和简洁性可能不如前两种方法,且递归深度过大时可能导致栈溢出。
五、实用建议
在实际应用中,选择合适的方法需要根据具体需求和场景进行权衡。如果数组较小且删除操作频繁,推荐使用覆盖法;如果需要保留原数组或进行复杂操作,推荐使用创建新数组法;如果需要处理复杂的递归问题,可以考虑使用递归法,但需注意递归深度和性能。
热门推荐
倍思/西圣PB:飞机上充电宝携带指南
民航局严查违规携带充电宝,这些规定你必须知道
保尔的事迹
《钢铁是怎样炼成的》中的保尔四次死里逃生的经过
违章后多久收到短信?详解交通违章处理全流程
大年初七:这件事大人今天不许做!
列奥纳多·达·芬奇:文艺复兴时期的全能天才
从“吃奶”到“吃干粮”:基督徒属灵成长的必由之路
怎样锻炼肾功能和肝功能
让简历闪耀的秘诀:如何写出令人印象深刻的实践经历
从首富到梁山好汉:卢俊义的传奇人生
玉麒麟卢俊义:梁山好汉的传奇人生
春运来了!高铁上如何安全充电?
春运高铁出行必备:充电宝携带全攻略
从零开始,轻松掌握素描技巧:你的艺术之旅从这里启航
素描初学者必备指南:工具选择与基础技巧详解
素描入门基础教程图解
素描初学者必备指南:工具选择与基础技巧详解
MPI分布式任务优化:mpirun参数解析与实战指南
新西兰自由行交通指南:长途巴士/火车/飞机介绍,不租车也能畅游
少儿AI机器人课程:开启儿童科技教育的未来之门
三花智控股价波动:新能源车市场的新机遇?
王菲春晚新作能否超越《传奇》?从创作到演绎全面解析
王菲春晚演唱《世界赠予我的》:一首歌温暖一座城
摄影100法 | 如何提炼?
《我的世界》1.21地下试炼密室大揭秘!
本田飞度改装大作战:Spoon vs Mugen,谁才是你的菜?
福州小寒来袭:冷空气+降雨双重暴击!
福州寒冬来袭!这些保暖小妙招你get了吗?
吃保健品救肝?小心肝臟過勞!肝臟救星保肝排毒7大食物