簡體   English   中英

如何訪問鏈表的 null 指針(節點)?

[英]How do I access a null pointer (node) of a linked list?

這個方法應該是把 append 一個 Node 放在一個鏈表的末尾。 該方法循環直到到達末尾,即 null 指針。 但是當我嘗試將 null 指針更改為一個值時,它會崩潰。 我應該如何解決這個問題? (Node 指針有一個 integer 數據和當前 Node 指向的另一個 Node 變量)。

void appendItem(LinkedList* list, int value)
{
    Node* temp = (Node*)malloc(sizeof(Node));
    temp = list->head;

    while(temp != NULL)
    {
        temp = temp->next;
    }

    temp->data = value;
    temp->next = NULL;
}

禁止取消引用NULL

取而代之的是,您應該管理指向應該更改的內容的指針。

另請注意,通過malloc()分配一些緩沖區並在其后用另一個值覆蓋結果會導致 memory 泄漏。

還有一點是malloc()系列的強制轉換結果被認為是一種不好的做法

固定代碼:

void appendItem(LinkedList* list, int value)
{
    Node** temp = &list->head;

    while(*temp != NULL)
    {
        temp = &(*temp)->next;
    }

    *temp = malloc(sizeof(Node));
    if (*temp != NULL)
    {
        (*temp)->data = value;
        (*temp)->next = NULL;
    }
}

這些行

Node* temp = (Node*)malloc(sizeof(Node));
temp = list->head;

產生 memory 泄漏。 首先分配了 memory 並將其地址存儲在指針temp中,然后指針temp的值被表達式list->head的值覆蓋。 結果,分配的 memory 的地址丟失了。

在這個循環之后

while(temp != NULL)
{
    temp = temp->next;
}

指針temp等於NULL 因此在這些語句中使用 null 指針來訪問 memory

temp->data = value;
temp->next = NULL;

調用未定義的行為。

例如,function 可以通過以下方式定義。

int appendItem( LinkedList *list, int value )
{
    Node *new_node = malloc( sizeof( Node ) );
    int success = new_node != NULL;

    if ( success )
    {
        new_node->data = value;
        new_node->next = NULL;

        if ( list->head == NULL )
        {
            list->head = new_node;
        }
        else
        {
            Node *current = list->head;
            while ( current->next != NULL ) current = current->next;
            current->next = new_node;
        }
    }

    return success;
}

請注意,memory 分配可能會失敗。 您需要在 function 中處理這種情況。 function 的調用者應該被告知這種情況。

此外,當您允許 append 將新節點添加到單鏈表時,該列表應定義為雙邊單鏈表。 也就是說,列表應該保留兩個指針:一個指向頭節點的指針,另一個指向尾節點的指針。 否則將節點附加到列表將是低效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM