链表按引用传递head时,if分支为何必须使用return语句?
问题分析:移除return后链表输出为空的原因
原代码
#include<iostream> using namespace std; class node{ public: int data; node* addr;//it's address of the next node node(int val){ data=val; addr = NULL; } }; void addVal(node* &head, int val){ node *n=new node(val); if (head==NULL){ head = n; return;///<-WHY THIS? } node *p=head; while(p->addr!=NULL){ p=p->addr; } p->addr=n; return; } void display(node *head){ node *p=head; while(p!=NULL){ cout<<p<<" "<<p->data<<" "<<p->addr<<endl; p=p->addr; } } int main(){ node *head=NULL; addVal(head,1); addVal(head,2); addVal(head,3); addVal(head,4); addVal(head,5); display(head); return 0; }
问题
移除if(head==NULL)分支中的return语句后,程序终端输出为空。明明通过引用传递head指针,修改函数内的head会影响实际值,为何此处必须使用return语句?
原因解析
核心问题出在去掉return后,第一次添加节点的流程会破坏链表结构:
第一次调用
addVal(head,1)时,head初始为NULL,进入if分支后把head指向新创建的节点n(这步没问题)。但因为没有return,代码会继续执行后续逻辑:- 创建指针
p指向head(也就是刚创建的节点n) - 此时
n->addr是NULL,while(p->addr != NULL)循环直接跳过 - 执行
p->addr = n,把节点n的addr指向了它自己,形成自引用的环
- 创建指针
后续调用
addVal时,程序会进入while(p->addr != NULL)的无限循环:因为第一个节点的addr永远指向自己,循环条件永远成立,程序卡死在这里,根本无法执行到display函数,所以终端没有任何输出。
添加return的作用是在初始化空链表后,直接终止函数,避免执行后续会破坏链表结构的代码,让后续的节点添加操作能正常找到链表末尾。这跟head是引用传递没有关系,纯粹是流程控制的问题。
内容的提问来源于stack exchange,提问作者TheMerchant
相关产品推荐
相关产品推荐

