链表push函数中node** head_ref双指针作用及插入元素失败原因问询
1. node** head_ref的作用
C/C++的函数参数默认采用值传递,如果你直接传一级指针node* head到函数中,函数内部修改的只是这个指针的副本,不会对函数外部的原头指针生效。
传入二级指针node** head_ref本质是传入了「指向原头指针的指针」,对*head_ref解引用后得到的就是函数外部的原头指针本身,修改该值可以直接更新外部的头节点地址,完成头插操作后能让外部拿到最新的头节点。
2. 链表插入失败的原因
你遇到的问题和Node大小写没有本质关联,核心问题和可能的关联问题如下:
- 代码存在致命逻辑错误:你代码的最后一行写的是
(*head_ref)=new node;,相当于把已经设置好data和next的新节点new_node直接丢弃,给头指针赋值了一个完全未初始化的全新空节点,之前的赋值操作全部失效,自然无法插入元素,链表始终为空。 - 大小写修改带来的编译问题:如果原代码的节点结构体/类定义的名称就是大写
Node,你只修改了函数内的类型为小写node,但没有同步修改结构体定义或者添加typedef Node node;的声明,会导致编译器无法识别node类型,编译失败无法运行。
修正后的正确代码
void push(node** head_ref, int new_data){ node* new_node = new node; new_node->data = new_data; new_node->next = (*head_ref); (*head_ref) = new_node; // 此处赋值为已经初始化好的new_node即可 }
如果你不想用二级指针,也可以用指针引用实现相同效果,语法更简单:
void push(node*& head_ref, int new_data){ node* new_node = new node; new_node->data = new_data; new_node->next = head_ref; head_ref = new_node; }
内容的提问来源于stack exchange,提问作者devacius the one above all
相关产品推荐
相关产品推荐

