链表尾插节点代码问题排查:无报错但功能不符合预期
问题分析与修复方案
我一眼就瞅出问题啦——你的attachEnd函数不小心修改了原本的链表头指针,这就是节点没按预期工作的核心原因!
问题出在哪?
看这段代码:
else { while ((*hptr)->next != NULL) { (*hptr) = (*hptr)->next; } (*hptr)->next = newnode; }
这里你直接操作了传入的*hptr(也就是主函数里的head指针的引用),在while循环里把它一步步移到了链表尾部。循环结束后,原来的head指针已经不再指向链表的头部,而是变成了最后一个节点!
这样一来,下次你再调用attachEnd或者尝试遍历链表时,都会从这个“新的head”(实际是原尾部)开始操作,自然看不到之前的节点,看起来就像新节点没被正确添加一样。
修复后的代码
解决方法很简单:用一个临时指针来遍历链表,不要直接修改传入的头指针引用。修改后的函数如下:
void attachEnd(node **hptr, node *newnode) { // 确保新节点的next为空,避免野指针 newnode->next = NULL; if (*hptr == NULL) { *hptr = newnode; } else { // 用临时指针current遍历,不修改原头指针 node *current = *hptr; while (current->next != NULL) { current = current->next; } current->next = newnode; } }
关键改动说明
- 新增了
newnode->next = NULL:确保新节点的尾部是正确终止的,避免出现循环链表或者野指针问题(即使你说newnode已初始化,加这一步更稳妥)。 - 使用临时指针
current代替直接操作*hptr:遍历过程中只会移动current,原头指针*hptr(也就是主函数里的head)始终指向链表头部,后续操作链表就正常了。
这样修改后,再调用attachEnd(&head, newnode),新节点就会被正确添加到链表尾部,同时表头指针也能保持正确啦。
内容的提问来源于stack exchange,提问作者Prathamesh Saraf
相关产品推荐
相关产品推荐

