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

如何删除队列中所有大于指定值的元素?附现有实现代码

你当前代码存在的问题

  • 类型拼写错误:删除节点时声明的Nodo* aux与你定义的节点类型Node不匹配,会直接触发编译报错
  • 未处理队首节点符合删除条件的场景:当前逻辑仅从队首的下一个节点开始判断,若队首节点值大于x会被遗漏
  • 野指针访问风险:节点删除后你仍然将已释放的n2赋值给n1、并访问n2->next,会触发内存访问异常

修复后的代码

void problem(Queue* c, int x) {
    if (isEmpty(c)) {
        printf("empty queue");       
        return;
    }
    // 先处理队首节点需要删除的情况
    while (c->top != NULL && c->top->value > x) {
        Node* aux = c->top;
        c->top = c->top->next;
        free(aux);
    }
    // 队首全部删完后队列可能为空,提前终止
    if (c->top == NULL) {
        return;
    }
    Node* n1 = c->top; 
    Node* n2 = c->top->next;
    while (n2 != NULL) {
        if (n2->value > x) {
            Node* aux = n2;
            n1->next = aux->next;
            free(aux);
            // 删除后仅移动n2指针,n1保持当前位置
            n2 = n1->next;
        } else {
            // 未命中删除规则时同时移动两个指针
            n1 = n2;
            n2 = n2->next;
        }
    }
}

补充说明

如果你的队列结构体中还维护了队尾指针,删除节点时如果判断到被删除的是队尾节点,需要同步将队尾指针更新为n1,避免后续入队操作出现异常。

内容的提问来源于stack exchange,提问作者Miguel Barra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:57:03