C语言单次遍历数组删除不符合判定条件元素的问题求助
问题分析
原有代码存在以下几处核心错误:
- 头文件缺失:C 标准中
bool类型定义在<stdbool.h>头文件中,未引入该头文件会直接触发编译错误。 - 判定参数传值错误:自定义判定函数传入的是数组下标
i,而非对应的数组元素arr[i],完全偏离“判断元素是否保留”的需求。 - 判定规则错误:你写的
i/2 == 0是整数除法逻辑,若需求是筛选奇数,应使用取余运算符%,即num % 2 != 0,当前的除法逻辑会错误匹配所有小于2的整数。 - 删除逻辑错误:直接将后一位元素覆盖到当前位置的写法,无法处理连续需要删除的元素,遍历到最后一个元素时还会出现
arr[i+1]的越界访问,同时未记录有效元素长度,筛选后的结果无法正常提取。
正确实现方案
使用快慢指针法,仅一次遍历即可完成筛选,时间复杂度O(n),空间复杂度O(1),完全符合你的需求:
快指针遍历所有数组元素,慢指针记录下一个有效元素的写入位置。快指针指向的元素符合保留条件时,将其写入慢指针位置后慢指针后移,否则仅快指针后移。遍历完成后慢指针的值就是筛选后数组的有效长度。
完整可运行代码如下:
#include <stdio.h> #include <stdbool.h> // 自定义判定函数,返回true的元素会被保留 bool isitright(int num) { // 示例规则:保留奇数,可根据需求自定义修改判定逻辑 return num % 2 != 0; } int main() { int arr[4] = {0, 1, 2, 3}; int len = sizeof(arr) / sizeof(arr[0]); int slow = 0; // 一次遍历完成筛选 for (int fast = 0; fast < len; fast++) { if (isitright(arr[fast])) { arr[slow++] = arr[fast]; } } // 输出筛选后的有效元素 for (int i = 0; i < slow; i++) { printf("%d ", arr[i]); } return 0; }
内容的提问来源于stack exchange,提问作者Rrr Rrr
相关产品推荐
相关产品推荐

