剑雨君 发表于 2014-8-16 17:55:52

在单链表的起始位置插入一个节点。求解释这样为什么行不通。

本帖最后由 剑雨君 于 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:27

把整个源码贴一下。。。

剑雨君 发表于 2014-8-18 17:24:42

一个人在战斗 发表于 2014-8-17 15:13
把整个源码贴一下。。。

其实没关系的,我想问的是替换上那3处注释的代码跟不替换有什么区别?

一个人在战斗 发表于 2014-8-18 17:54:54

剑雨君 发表于 2014-8-18 17:24
其实没关系的,我想问的是替换上那3处注释的代码跟不替换有什么区别?

我写这个的时候就没用到过指向指针的指针。。。

musilintan 发表于 2014-8-19 09:03:25

程序的根本错误就是修改局部变量。这个函数没有返回值,能和外界联系的只有head头指针所指向的内存。
所以,当你往中间和屁股插的时候会有反应,而往头上插的时候就不起作用了。因为你外界和这个链表唯一的联系就是head。而且head还是单向,只能往下。当利用head查询时,自然查不到头部以上的存在。

说这么一堆你可能会产生新的问题。head没变?对head没变。因为你改的head一直都是局部变量head。你需要改变的是调用该函数时的参数head。

不知道你明白没。要想彻底理解,还必须知道为什么人家原来用的是二级指针。这是原版用来解决保存head地址的方法。如果按照你这样做的方法的话:
解决方案1:设定一个全局变量head用来保存头节点。
解决方案2:添加该函数的返回值,用来返回head头节点。

以上推荐使用解决方案2,这种方法是常用的,而且方便简洁+。。。

语文不及格,希望你能意会。。。。

剑雨君 发表于 2014-8-19 20:40:12

musilintan 发表于 2014-8-19 09:03
程序的根本错误就是修改局部变量。这个函数没有返回值,能和外界联系的只有head头指针所指向的内存。
所以 ...

我懂了!那本书不提局部变量我就看不懂。。哎。使用二级指针可以修改头指针的地址,因为这就是在修改二级指针的内容!这样就把地址给改了!谢谢大神!
页: [1]
查看完整版本: 在单链表的起始位置插入一个节点。求解释这样为什么行不通。