C语言有序链表插入双指针实现错误排查(K.N.King习题13)
原始给定函数的问题
- 空链表访问越界:当传入的
list为NULL时,cur初始化为NULL,第一次执行cur->value就会触发空指针解引用,程序直接崩溃。 - 尾插场景访问越界:当新节点的value大于链表所有节点的value时,循环会执行到
cur变为NULL,此时访问cur->value同样触发空指针错误。 - 头插场景逻辑错误:当新节点需要插入到链表头部时,
prev仍为初始值NULL,执行prev->next会直接崩溃,且原头节点会丢失,返回值错误。
你实现的双指针版本的错误分析
你对双指针的使用是错误的,核心问题有两个:
- 未正确使用二级指针修改链表关系:你定义了二级指针
pp但全程没有通过解引用pp修改原链表的指针,最后执行的list = new_node修改的是函数的形参list(属于函数局部变量),不会对外部链表的实际结构产生任何影响。 - 返回值逻辑错误:你最后直接返回了被赋值为
new_node的局部变量list,如果新节点插入在链表中间或者末尾,返回值会直接丢弃原链表的头节点,链表结构完全被破坏。
双指针版本的正确实现
二级指针的核心作用是存储「指向链表节点的指针」的地址,通过修改*pp可以直接修改原链表的头指针或者任意节点的next成员,不需要单独处理头插、空链表等特殊场景,正确实现如下:
struct node *insert_into_ordered_list(struct node *list, struct node *new_node) { struct node **pp = &list; // 遍历找到第一个值大于等于新节点的指针位置 while (*pp != NULL && (*pp)->value < new_node->value) { pp = &(*pp)->next; } // 插入新节点 new_node->next = *pp; *pp = new_node; // 返回链表头指针(头插时list已经被*pp修改为新节点) return list; }
内容的提问来源于stack exchange,提问作者Whistle1088
相关产品推荐
相关产品推荐

