首页 文章

删除双向链表的头部

提问于
浏览
0

很抱歉这么低质量的问题,但我不知道为什么以下代码不起作用 .

list指向节点的头部 .

void DeleteHeadNode(Node** list, Node * node)
    {
        if ((*list) == node) {
            Node * next = node->nextnode;
            next->prevnode = NULL;
        free(*list);
    }
}

2 回答

  • 0

    Node** 的用法用作 alias . 如果传递了列表变量的地址,可以通过更改 Node* 值来改变它 .

    通过这种方式,可以将传递的列表变量设置为null或设置为第二个节点 .

    以下是使用模式 .

    void DeleteNode(Node** list, int data)
    {
        while (*list != NULL && (*list)->data != data) {
            list = &(node->nextnode);
        }
        if (*list != NULL) {
            Node* found = *list;
            *list = found->nextnode;
    
            if (found->nextnode != NULL) {
                found->nextnode->prevnode = *list;
            }
            free(found);
        }
    }
    

    用法:

    Node* list;
    ...
    DeleteNode(&list, ...);
    

    之前的节点( prevnode ,双链表)并不是必需的 .

    while 循环很有意义:别名 list 从列表头设置为nextnode字段的地址 . 因此, *list 的后续更改会更改传递的列表变量或某些nextnode字段 .

    void SortedInsertNode(Node** list, int data)
    {
        Node* node = (Node*) malloc(sizeof(Node));
        node->data = data;
        node->prevnode = NULL;
        node->nextnode = NULL;
        while (*list != NULL && data >= (*list)->data) {
            node->prevnode = *list;
            list = &(node->nextnode);
        }
        node->nextnode = *list;
        *list = node;
    
        if (node->nextnode != NULL) {
            node->nextnode->prevnode = *list;
        }
    }
    

    删除头部:

    void DeleteHead(Node** list)
    {
        if (*list != null) {
            Node* dead = *list;
            *list = (*list)->nextnode;
            (*list)->prevnede = NULL;
            free(dead);
        }
    }
    
  • 0

    我猜"doesn't work"意味着 list 在你的功能之后不再有效 - 这将是真的 .

    你应该有

    void DeleteHeadNode(Node** list, Node* node)
    {
        if ((node != NULL) && (*list == node))    // check node being deleted
        {
            Node* next = node->nextnode;
            if (next != NULL)                     // ensure next exists
            {
               next->prevnode = NULL;
               free(*list);
               list = &next;                      // update pointer to head of list
            }
            else                                  // no next, list is now becoming empty
            {
               free(*list);
               list = NULL;                       // update pointer to head of list
            }
        }
    }
    

相关问题