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

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了,当然就起作用啦。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值