最近,我在学习链表的头插操作时遇到了一个问题:
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);//头插
}