链表特定节点内存释放异常:按月份过滤节点出现乱码求助
修复链表按月份区间过滤的问题
你遇到的问题核心是没有正确维护链表的连接关系,删除节点后没把前后节点衔接起来,同时新链表的构建也没串联后续符合条件的节点,导致出现野指针访问,表现为随机数值。咱们一步步分析问题并修复:
你的代码存在的核心问题
- 没有跟踪当前节点的前驱节点:当删除
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; }
修复思路说明
- 提前移动当前指针:在判断节点是否保留之前,先把
current移到下一个节点,这样即使当前节点被释放,也不会丢失链表的后续位置。 - 维护新链表的头尾指针:
new_head记录过滤后链表的头,new_tail负责把后续符合条件的节点逐个串联起来,确保整个链表是完整的。 - 清空尾节点的next:每次添加节点到新链表后,把
new_tail->next设为NULL,避免旧链表中残留的指针导致访问错误。 - 分离判断与操作:先暂存当前节点,再处理移动和判断,逻辑更清晰,避免指针混乱。
这样修改后,就能正确删除不符合月份区间的节点,同时保留的节点会形成一个完整的新链表,不会出现随机数值的问题。
内容的提问来源于stack exchange,提问作者Jorge Proença
相关产品推荐
相关产品推荐

