1. 程式人生 > >對於雙向連結串列的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為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;
    }
}