繁体   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