在单链表的起始位置插入一个节点。求解释这样为什么行不通。
本帖最后由 剑雨君 于 2014-8-18 19:42 编辑//插入操作(注:该插入函数对插入到中间和插入到尾部的数都没问题,只有插入到头部才有问题。注释中写的代码(有3处)才完全正确)
void insert( Node *head /* Node **head */, int new_value )
{
Node *current;
Node *previous;
Node *new_p;
//得到第一个节点的指针
current = head; //current = *head;
previous = NULL;
//寻找正确的插入位置,方法是按序访问链表,直到到达一个其值大于或等于新值的节点
while( current != NULL && current->value < new_value )
{
previous = current;
current = current->link;
}
//为新节点分配内存
new_p = ( Node * )malloc( sizeof( Node ) );
if( new_p == NULL )
exit( 0 );
new_p->value = new_value;
//把新节点插入到链表中
new_p->link = current;
if( previous == NULL )//新节点是第一个的情况
head = new_p; //*head = new_p;
else
previous->link = new_p;
}
把整个源码贴一下。。。 一个人在战斗 发表于 2014-8-17 15:13
把整个源码贴一下。。。
其实没关系的,我想问的是替换上那3处注释的代码跟不替换有什么区别? 剑雨君 发表于 2014-8-18 17:24
其实没关系的,我想问的是替换上那3处注释的代码跟不替换有什么区别?
我写这个的时候就没用到过指向指针的指针。。。 程序的根本错误就是修改局部变量。这个函数没有返回值,能和外界联系的只有head头指针所指向的内存。
所以,当你往中间和屁股插的时候会有反应,而往头上插的时候就不起作用了。因为你外界和这个链表唯一的联系就是head。而且head还是单向,只能往下。当利用head查询时,自然查不到头部以上的存在。
说这么一堆你可能会产生新的问题。head没变?对head没变。因为你改的head一直都是局部变量head。你需要改变的是调用该函数时的参数head。
不知道你明白没。要想彻底理解,还必须知道为什么人家原来用的是二级指针。这是原版用来解决保存head地址的方法。如果按照你这样做的方法的话:
解决方案1:设定一个全局变量head用来保存头节点。
解决方案2:添加该函数的返回值,用来返回head头节点。
以上推荐使用解决方案2,这种方法是常用的,而且方便简洁+。。。
语文不及格,希望你能意会。。。。 musilintan 发表于 2014-8-19 09:03
程序的根本错误就是修改局部变量。这个函数没有返回值,能和外界联系的只有head头指针所指向的内存。
所以 ...
我懂了!那本书不提局部变量我就看不懂。。哎。使用二级指针可以修改头指针的地址,因为这就是在修改二级指针的内容!这样就把地址给改了!谢谢大神!
页:
[1]