You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:15:04