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

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

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);//头插 
}
上一篇:剑指offer-删除链表中重复的节点


下一篇:C语言构建一个链表以及操作链表