對於雙向連結串列的NULL的一些研究
阿新 • • 發佈:2019-02-19
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;
}
}