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