如何实现C语言删除动态数组指定元素并返回新数组的函数?
实现思路
- 第一步:遍历原数组,统计所有不需要删除的元素总个数,记为
new_dim - 第二步:如果
new_dim和原数组长度dim一致,说明没有匹配的待删除元素,直接返回原数组即可 - 第三步:如果
new_dim为0,说明所有元素都要被删除,释放原数组后返回NULL即可 - 第四步:原地移动保留元素到数组前部,再用
realloc缩容数组,或者申请新内存复制保留元素后释放原数组 - 第五步:返回处理后的数组指针
完整代码实现(删除所有值等于el的元素)
#include <stdlib.h> int* del_element(int* vector, int dim, int el) { // 统计保留元素的数量 int new_dim = 0; for (int i = 0; i < dim; i++) { if (vector[i] != el) { new_dim++; } } // 无元素需要删除 if (new_dim == dim) { return vector; } // 所有元素都要删除 if (new_dim == 0) { free(vector); return NULL; } // 原地移动保留元素到数组头部 int pos = 0; for (int i = 0; i < dim; i++) { if (vector[i] != el) { vector[pos++] = vector[i]; } } // 缩容数组到新长度 int* new_vec = realloc(vector, new_dim * sizeof(int)); // 若realloc失败返回原数组,也可根据需求改成free后返回NULL return new_vec ? new_vec : vector; }
扩展实现(删除下标为el的元素)
如果你的需求是删除指定下标而非匹配值的元素,可参考以下代码:
#include <stdlib.h> int* del_element(int* vector, int dim, int el) { // 校验下标合法性 if (el < 0 || el >= dim || vector == NULL) { return vector; } // 移动元素覆盖待删除位置 for (int i = el; i < dim - 1; i++) { vector[i] = vector[i + 1]; } // 缩容数组 int* new_vec = realloc(vector, (dim - 1) * sizeof(int)); return new_vec ? new_vec : vector; }
注意事项
- 原数组必须是
malloc/calloc/realloc动态分配的,否则函数内的free和realloc会触发未定义行为 - 函数返回的数组依然是动态分配的,使用完后需要调用者主动
free,避免内存泄漏 - 如果
realloc调用失败,会返回未缩容的原数组,其中前N个元素是处理后的有效内容
内容的提问来源于stack exchange,提问作者user17193077
相关产品推荐
相关产品推荐

