链表问题
void delnode(PNode *head,int n){
if(NULL==head)
return;
PNode temp=NULL;
int i=0;
if(n==1)//如果要删除的是第一个结点;
{
temp=*head;
*head=(*head)->PNext;
free(temp);
return;
}
for(temp=*head,i=2;temp->PNext!=NULL;temp=temp->PNext,i++)
{
if(n==i)
{
PNode t=temp->PNext;
temp->PNext=temp->PNext->PNext;
free(t);
return;
}
}
if(n>i)
printf("所要删除的结点个数超过链表长度!\n\n");
}
在这个删除链表结点的函数中,我形参直接用head,结果当需要删除的是第一个结点的时候,程序陷入了死循环,但是删除其他结点就没问题,当我改变形参传递*head就可以了,这是为什么啊?大神求指教~!! 如果形参是head,在调用函数时会自动进行一个复制操作。导致的后果就是,你在函数中的所有操作都与你的实参无关。就算你改的面目全非,在返回主函数时,head还是原来的那个head。
如果形参是*head,那么传递的是head的地址。那么尽管子函数对head的地址进行了复制,但是通过这个地址对head的一系列操作还是将会确实的影响到主函数中的值。
具体请参看c语言教程中的传值和传址的章节。
*head是一个指针,指向的是一个地址,接受实参传递的时候,就会指向实参的内存空间。head的话是一个变量,等于接受实参的时候等价与变量赋值给变量。如:
int *p = a;
int p = a;这两条的区别
页:
[1]