c++ 全局变量的问题

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是你说的那个全局head的拷贝,它们两个是完全不同的两个变量,只是在函数刚被调用的时候,都指向同一块内存空间,在这个函数中改变head对于全局head是不会有任何影响的。与此相反,如果你采用传引用调用book *&head,则函数中的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,否则就会内存泄漏)。在这里,它本身只是一个指针,只占用栈空间,随着这个函数的返回,它占用的栈空间会自动释放。

追问

非常感谢!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-29
程序应该是删除链表中指定的节点,需要找到此节点并判断节点的位置,
如果刚刚好是头节点,因为head是指向头节点的,所以需要指向下一个节点。
lz还是好好看书,没太看明白你想要问什么追问

抱歉手机打字没表达清楚 其实就是想说head在这个循环里指向的位置改变了,那全局变量的head指针指向的位置会变化吗?还有head改变之后为什么要有::head=head;这样改变全局的head指向呢,Delete这个函数体接受的是head的内存地址,在delete里面改变head不就已经改变了全局的head变量了吗? 还请在解答下麻烦了。

追答if(head->num==num)  // head->next->num ??? 你下面的l = head->next
{
l=head->next;
head=l->next;
::head=head; //:: c++中就是限定作用域的 
delete l;
cout<<"successful"<<endl;
return;
}

相似回答