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

链表特定节点内存释放异常:按月份过滤节点出现乱码求助

修复链表按月份区间过滤的问题

你遇到的问题核心是没有正确维护链表的连接关系,删除节点后没把前后节点衔接起来,同时新链表的构建也没串联后续符合条件的节点,导致出现野指针访问,表现为随机数值。咱们一步步分析问题并修复:

你的代码存在的核心问题

  • 没有跟踪当前节点的前驱节点:当删除aux指向的节点时,前面的节点(如果有的话)的next指针没有更新,导致链表断裂,后续访问会碰到已释放的内存或野指针。
  • 新链表aux2只记录了第一个符合条件的节点,但没有把后续符合条件的节点串联起来,最后返回的aux2可能只是孤立的单个节点,丢失了后面的有效节点。

修复后的代码实现

LISTAPAISES *Filtra_month(LISTAPAISES *head, int month_init, int month_final) {
    LISTAPAISES *new_head = NULL;  // 新链表的头节点
    LISTAPAISES *new_tail = NULL;  // 新链表的尾节点,用于串联后续节点
    LISTAPAISES *current = head;
    LISTAPAISES *temp = NULL;

    while (current != NULL) {
        temp = current;
        current = current->next;  // 先移动到下一个节点,避免删除当前节点后丢失指针

        // 检查月份是否在目标区间内
        if (temp->country.month >= month_init && temp->country.month <= month_final) {
            // 保留该节点,加入新链表
            if (new_head == NULL) {
                new_head = temp;  // 第一个有效节点作为新头
                new_tail = temp;
            } else {
                new_tail->next = temp;  // 把当前节点接到新链表尾部
                new_tail = temp;
            }
            new_tail->next = NULL;  // 确保尾节点的next为空,避免残留旧链表的指针
        } else {
            // 删除不符合条件的节点
            free(temp);
        }
    }

    return new_head;
}

修复思路说明

  1. 提前移动当前指针:在判断节点是否保留之前,先把current移到下一个节点,这样即使当前节点被释放,也不会丢失链表的后续位置。
  2. 维护新链表的头尾指针:new_head记录过滤后链表的头,new_tail负责把后续符合条件的节点逐个串联起来,确保整个链表是完整的。
  3. 清空尾节点的next:每次添加节点到新链表后,把new_tail->next设为NULL,避免旧链表中残留的指针导致访问错误。
  4. 分离判断与操作:先暂存当前节点,再处理移动和判断,逻辑更清晰,避免指针混乱。

这样修改后,就能正确删除不符合月份区间的节点,同时保留的节点会形成一个完整的新链表,不会出现随机数值的问题。

内容的提问来源于stack exchange,提问作者Jorge Proença

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:37:32