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;
}
}