鱼C论坛

 找回密码
 立即注册
查看: 2276|回复: 5

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

[复制链接]
发表于 2014-8-16 17:55:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 剑雨君 于 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;
}
1111111.png


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-17 15:13:27 | 显示全部楼层
把整个源码贴一下。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-18 17:24:42 | 显示全部楼层
一个人在战斗 发表于 2014-8-17 15:13
把整个源码贴一下。。。

其实没关系的,我想问的是替换上那3处注释的代码跟不替换有什么区别?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我写这个的时候就没用到过指向指针的指针。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

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

评分

参与人数 1鱼币 +3 收起 理由
川本姨夫 + 3 说得对

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

我懂了!那本书不提局部变量我就看不懂。。哎。使用二级指针可以修改头指针的地址,因为这就是在修改二级指针的内容!这样就把地址给改了!谢谢大神!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 20:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表