实现有序无重复双向链表 插入函数去重逻辑崩溃如何修复
崩溃原因
你的去重逻辑触发空指针的核心原因是:while循环结束后current->next可能为NULL(此时新节点需要插入到链表末尾),你没有做空判断就直接访问current->next->data,直接触发非法内存访问。
另外额外提醒:你提到这是字符串类型的双向链表,原代码中直接用>/</==比较data指针的写法是错误的,实际比较的是字符串的内存地址而非内容,需要替换为标准库的strcmp函数做字符串内容比较。
去重逻辑实现方案
你需要补充两处判断:
- 插入前先校验头节点是否和新节点值重复
- 遍历结束后先判断当前节点、下一个节点是否和新节点值重复,存在重复则直接终止插入流程
修复后完整代码
#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
相关产品推荐
相关产品推荐

