链表的头指针在函数里修改怎么没有用?

来源:互联网 发布:中兴笔试编程题 编辑:程序博客网 时间:2024/06/10 20:09

void del(head,num)
struct student *head;
long num;
{
struct student *p1,*p2;
//表空
if(head==NULL){
printf("\nlist null!\n");
return ;
}
p1=head;
//寻找要删除的节点
while(p1->num!=num && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
//找到了要删除的节点
if(num==p1->num)
{
if(p1==head)//要删除的节点是头节点
head=p1->next;
else p2->next=p1->next;
printf("delete:%ld\n",num);

}else//没有找到删除的节点
printf("%ld not been found!\n",num);
return ;
}

这是个单向链表的删除节点函数
删除头节点居然不起作用,但可以删除其它节点

我知道通过return head可以改正这个错误,但上面的方法为什么不行呢?

 

 

 

 

我的看法:
当你创建这样一个函数
void del(struct student* head,long num);

然后去调用他,例:
del(h,3);  //h为struct student*类型
假设:&h为 0010;  //为h开辟的地址;
       h为 1000;  //0010 里存放的内容,是一个地址
      *h为 8;     //1000 里存放的内容,实际上在你的程序里这里存放的是一个结构型变量。
del(h,3); 当调用了这一句时,实际上是把1000传给了head;
这时:
   &head一定不是 0010;  
//系统会给head新开辟一个内存,这里假设为 0020
    head为 1000;  
      *h为 8;     
head=p1->next;  
//当执行这句时实际上是把head给改了,就是说0020里的内容给改了。假设改为了2000;

这时:
&h还是等于 0010;  0010里的还是1000
&head还是等于 0020; 0020里的已经改成了2000
所以h没有变。也就是你说的删除头节点不起作用。
要是用return head的话,就是把0010里的内容给改成2000了,当然就起作用啦。