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

实现有序无重复双向链表 插入函数去重逻辑崩溃如何修复

崩溃原因

你的去重逻辑触发空指针的核心原因是:while循环结束后current->next可能为NULL(此时新节点需要插入到链表末尾),你没有做空判断就直接访问current->next->data,直接触发非法内存访问。
另外额外提醒:你提到这是字符串类型的双向链表,原代码中直接用>/</==比较data指针的写法是错误的,实际比较的是字符串的内存地址而非内容,需要替换为标准库的strcmp函数做字符串内容比较。

去重逻辑实现方案

你需要补充两处判断:

  1. 插入前先校验头节点是否和新节点值重复
  2. 遍历结束后先判断当前节点、下一个节点是否和新节点值重复,存在重复则直接终止插入流程

修复后完整代码

#include <string.h> // 字符串比较需要引入该头文件

void sortedInsert(struct Node** head_ref, struct Node* newNode)
{
    struct Node* current;

    // 链表为空直接插入
    if (*head_ref == NULL) {
        *head_ref = newNode;
        return;
    }

    int cmp_res = strcmp((*head_ref)->data, newNode->data);
    // 头节点和新节点值重复,直接返回(如需释放节点可在此处free(newNode))
    if (cmp_res == 0) {
        return;
    }
    // 新节点值比头节点小,插入到头部
    else if (cmp_res > 0) {
        newNode->next = *head_ref;
        newNode->next->prev = newNode;
        *head_ref = newNode;
        return;
    }

    current = *head_ref;
    // 遍历找到插入位置
    while (current->next != NULL && strcmp(current->next->data, newNode->data) < 0) {
        current = current->next;
    }

    // 去重判断
    // 1. 下一个节点存在且值相等,重复
    if (current->next != NULL && strcmp(current->next->data, newNode->data) == 0) {
        return;
    }
    // 2. 当前节点值相等(当前为尾节点的重复场景),重复
    if (strcmp(current->data, newNode->data) == 0) {
        return;
    }

    // 无重复,执行插入
    newNode->next = current->next;
    if (current->next != NULL) {
        newNode->next->prev = newNode;
    }
    current->next = newNode;
    newNode->prev = current;
}

注意事项

如果重复插入时不需要保留newNode,建议在return前添加free(newNode)避免内存泄漏,可根据你的实际内存管理规则调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:45:02