链表头插中遇到的二级指针问题

最近,我在学习链表的头插操作时遇到了一个问题:

void head_insert(NODE *phead,NODE *pnew)//链表头插,输入头指针和指向新结点的指针 
{
	pnew->pnext=phead;//step1:新结点指向第一个数据结点 
	phead=pnew;//step2:头指针指向新结点 
}
int main(void)
{
    NODE *header;
    header=create_node(10);//创建第一个数据结点 
    NODE *pnew;
    pnew=create_node(0);//新结点 
    head_insert(header,pnew);//头插
}

当我写出来链表头插函数header_insert(),并进行调用时,发现程序的结果与预期不符:本来应该是 0\n 10\n;但结果只有一个10\n

经过我在dev-cpp上调试,观察header的值发现,在函数head_insert()调用前后,header的值没有发生改变。

这是因为我调用函数head_insert()的目的是改变pnew->pnext和header的值。我传进去了pnext所在结构体的地址pnew,通过地址pnew对pnext的改变是有效的。而传进去的header把它的值复制给了phead,那么对phead的操作是不会对header产生影响的。

也就是说:在子函数内对指针参数指向的变量进行的操作是有效的,而直接对指针参数进行的操作则是无效的。

那么只需用二级指针即可完成对指针的操作:

void head_insert(NODE **phead,NODE *pnew)//链表头插,输入头指针的地址和指向新结点的指针 
{
	pnew->pnext=*phead;//step1:新结点指向第一个数据结点 
	*phead=pnew;//step2:头指针指向新结点(改变了header的值) 
}//对phead的赋值操作不会对header产生影响
//header本身也是一个变量,以header为参数只是把header中存有的地址值复制给了phead,那么当对phead的值进行修改时,对header本身的地址值没有影响。
int main(void)
{
	NODE *header;
	header=create_node(10);//创建第一个数据结点 
	NODE *pnew;
	pnew=create_node(0);//新结点 
	head_insert(&header,pnew);//头插 
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RobotFreak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值