void Delete(book *head,int num)
{
book *l;
if(head->num==num)
{
l=head->next;
head=l->next;
::head=head;
delete l;
cout<<"successful"<<endl;
return;
}
while(head)
{
if(head->next==NULL)
{cout<<"not find"<<endl;return;}
if(head->next->num==num)
{
l=head->next;
head->next=l.next;
delete l;
cout<<"successful"<<endl;
return;
}
head=head->next;
}
cout<<"can't found"<<endl;
}
这是部分代码,完整的太长手机码不出来..还请见谅。是这样的这段代码是我看链表时遇到的问题,其中head是全局变量,我的问题是delete接收的是head的内存地址那么做的改变不都会保存下来吗?比如最后一句head每次都会被赋值后一个链表的地址,那全局的head不也变了吗?这样的话即使这个函数体删除了某个链表循环了几次head前的几个链表不都找不到了吗?还请耐心解答下手机码字不容易T_T
问
抱歉手机打字没表达清楚 其实就是想说head在这个循环里指向的位置改变了,那全局变量的head指针指向的位置会变化吗?还有head改变之后为什么要有::head=head;这样改变全局的head指向呢,Delete这个函数体接受的是head的内存地址,在delete里面改变head不就已经改变了全局的head变量了吗? 还请在解答下麻烦了。
谢谢,稍微有点思路了,还想请问个小问题 ,那这个局部head在调用完毕之后不需要delete吗?谢谢!
谢谢,稍微有点思路了,还想请问个小问题 ,那这个局部head在调用完毕之后不需要delete吗?以及第一次判断修改了全局变量::head=head;的值,那第二次判断为什么没有修改呢...?谢谢!
追答第一次修改::head的值是因为确实需要修改,因为if(head->num==num)
这个判断告诉我们想要删除的就是head所指向的这个节点。所以将::head修改为下一个节点,也就是::head = head=l->next;
另外在这里局部head是不需要删除的,我们要先搞清楚delete的作用是什么,它并不是说要释放某个指针本身,而是要释放这个指针所指向的堆空间(通过new来申请),然后就是区分堆栈的区别,堆空间是通过调用new函数来申请的,相应的也必须通过delete的方式来释放,栈空间则是自动分配,自动释放。在这个函数中并没有通过new的方式分配一块新的堆空间,并把这块空间的地址赋给head(如果是这种情况的话,而且之后并不要这块新内存空间,就必须delete head,否则就会内存泄漏)。在这里,它本身只是一个指针,只占用栈空间,随着这个函数的返回,它占用的栈空间会自动释放。
非常感谢!
抱歉手机打字没表达清楚 其实就是想说head在这个循环里指向的位置改变了,那全局变量的head指针指向的位置会变化吗?还有head改变之后为什么要有::head=head;这样改变全局的head指向呢,Delete这个函数体接受的是head的内存地址,在delete里面改变head不就已经改变了全局的head变量了吗? 还请在解答下麻烦了。
追答if(head->num==num) // head->next->num ??? 你下面的l = head->next