fanzhihao 发表于 2016-5-5 17:36:46

链表问题

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就可以了,这是为什么啊?大神求指教~!!

经典人物 发表于 2016-5-5 21:00:02

如果形参是head,在调用函数时会自动进行一个复制操作。导致的后果就是,你在函数中的所有操作都与你的实参无关。就算你改的面目全非,在返回主函数时,head还是原来的那个head。
如果形参是*head,那么传递的是head的地址。那么尽管子函数对head的地址进行了复制,但是通过这个地址对head的一系列操作还是将会确实的影响到主函数中的值。
具体请参看c语言教程中的传值和传址的章节。

金石201 发表于 2016-5-6 16:05:54

*head是一个指针,指向的是一个地址,接受实参传递的时候,就会指向实参的内存空间。head的话是一个变量,等于接受实参的时候等价与变量赋值给变量。如:
int *p = a;
int p = a;这两条的区别
页: [1]
查看完整版本: 链表问题