对于双向链表的NULL的一些研究

Head*InsertLineNode(Head*head, LineNode*node, LineDxfData lindedata)
{
    LineNode*temp= NULL;
    //主分空表挂入,和有数据时候的挂入
    //空表挂入
    if (!(head->length))
    {

        head->first = node;
        head->length++;//注意这个用法,不要写成head->length=length++,因为这里不知道后面的length到底是什么
        return head;
    }
    //如果不是空表,现在数据与以往数据之间也没有关系时候,直接往最后挂
    else
    {
        temp = head->first;//遍历用的
        while (temp)//当temp->nextNode为NULL的时候说明已经找到最后一个了,这时候要跳出循环
                            //特别注意如果这里用while(temp)那么跳出循环的时候,temp已经是NULL了这不是最后一个结点,要指向NULL才是!!

        {
            temp = temp->nextNode;
        }
        node->priorNode = temp->priorNode;
        temp->priorNode->nextNode = node;

        /*node->priorNode = temp;
        temp->nextNode = node;*/
        head->length++;//每插入一次就要加一次
        return head;
    }
}

主要问题是我想在寻找最后一个结点时候把新结点挂上去,但用上面的代码发现出错,说访问地址出错。
原因就在下面代码上

while(temp)
temp=temp->nextNode ;

这行代码是想要找到最后结点,但是事实上但跳出while循环的时候temp不是最后一个结点而是NULL,我们要找的是temp->nextNode=NULL的那个(也就是最后的结点).


define NULL 0 //C++

所以是可以直接运用来作为while判断的值的。

所以我把判断的这段代码改成

while (temp=temp->nextNode)
    temp = temp->nextNode;
    node->priorNode = temp;
    temp->nextNode = node;

验证是可以了。
但我想,既然上面

while(temp)
temp=temp->nextNode ;

是因为这个不是我想要的结点而是最后结点的后一位,那么我是不是把node的前后向结点变一下如下,就可以了呢?

node->priorNode = temp->priorNode;
temp->priorNode->nextNode = node;

事实上,还是不行。最后发现,其实NULL只是一个0,不是地址,对于这个NULL而言,它已经不知道谁是它的priorNode了,所以上面的代码就是错的。这点有点像失忆一般,看上去好像不好。
但事实上,如果能够从上面的代码找到NULL的前向结点,那么就乱了,因为同一个工程里面还有其他链表的尾结点也是指向NULL的,那么这个时候,你说它到底指向哪个链表的尾结点呢?
所以是挺高明的。
正确代码为:

Head*InsertLineNode(Head*head, LineNode*node, LineDxfData lindedata)
{
    LineNode*temp= NULL;
    //主分空表挂入,和有数据时候的挂入
    //空表挂入
    if (!(head->length))
    {

        head->first = node;
        head->length++;//注意这个用法,不要写成head->length=length++,因为这里不知道后面的length到底是什么
        return head;
    }
    //如果不是空表,现在数据与以往数据之间也没有关系时候,直接往最后挂
    else
    {
        temp = head->first;//遍历用的
        while (temp=temp->nextNode)//当temp->nextNode为NULL的时候说明已经找到最后一个了,这时候要跳出循环
                            //特别注意如果这里用while(temp)那么跳出循环的时候,temp已经是NULL了这不是最后一个结点,要指向NULL才是!!

        {
            temp = temp->nextNode;
        }
        node->priorNode = temp;
        temp->nextNode = node;
        head->length++;//每插入一次就要加一次
        return head;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值