C语言如何正确更新指针实现链表插入 修复while循环不执行问题
问题修复方案
核心错误原因
- 错误修改二级指针形参本身:函数中
_list = &list;修改的是二级指针形参的本地副本,不会影响外层传入的指针变量,且list是函数局部变量,离开函数后地址立即失效,导致外层的data.timeNodeList永远保持为NULL,所以每次调用时*_list都是NULL,while循环永远不会执行。 - 新分配的节点未关联到原链表:仅给局部指针
list分配了内存,没有将新节点挂载到原链表的对应位置,新节点的next指针也未初始化,存在野指针风险。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef struct _tDateTimeNode { struct _tDateTimeNode *next; } tDateTimeNode; typedef struct _ApiData { tDateTimeNode *timeNodeList; } tApiData; void dateTimeNode_insert(tDateTimeNode **_list) { bool found = false; // 用二级指针遍历可直接定位插入位置,无需额外记录前驱节点 tDateTimeNode **curr = _list; while (*curr != NULL && !found) { printf("This code will run after the first insertion!\n"); curr = &(*curr)->next; } if (*curr == NULL) { printf("Allocate new node\n"); *curr = (tDateTimeNode *)malloc(sizeof(tDateTimeNode)); (*curr)->next = NULL; // 初始化next指针避免野指针 } } int main() { tApiData data; data.timeNodeList = NULL; tDateTimeNode **timeNode = &(data.timeNodeList); dateTimeNode_insert(timeNode); dateTimeNode_insert(timeNode); dateTimeNode_insert(timeNode); dateTimeNode_insert(timeNode); // 释放内存避免泄漏 tDateTimeNode *p = data.timeNodeList; while (p) { tDateTimeNode *tmp = p; p = p->next; free(tmp); } return 0; }
修复说明
- 改用二级指针
curr遍历链表:可以直接定位到链表末尾的NULL指针所在的地址,不需要额外记录前驱节点,空链表和非空链表的插入逻辑可以统一处理。 - 直接修改
*curr的值:将新分配的节点地址赋值给*curr,相当于直接修改外层链表对应位置的指针变量,插入操作真正生效。 - 初始化新节点的
next指针为NULL,避免后续遍历出现野指针。
内容的提问来源于stack exchange,提问作者Antonio Gamiz Delgado
相关产品推荐
相关产品推荐

