【问题标题】:Deleting the head of doubly linked list删除双向链表的头部
【发布时间】:2017-07-08 04:04:30
【问题描述】:

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

list 指向节点的头部。

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

【问题讨论】:

  • “不起作用”是什么意思?
  • 当我尝试连续删除头部时它会冻结
  • 那是因为你的变量 list 第二次有一个无效的指针 - 试试我答案中的代码。
  • 您的问题解决了吗?答案有帮助吗?如果是这样,您应该将其标记为选定的答案,这就是 SO 的工作方式;)

标签: doubly-linked-list


【解决方案1】:

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

以这种方式将传递的列表变量设置为空或第二个节点。

以下是使用模式。

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 从列表头设置到下一个节点字段的地址。因此,*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);
    }
}

【讨论】:

  • 您重写的DeleteNode() 函数执行的操作完全 与 OP 的操作不同。你根本没有回答这个问题。
  • @FKEinternet 是的,我应该这样写(不过我重命名了函数)。删除我要添加的头部
【解决方案2】:

我猜“不起作用”意味着 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
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多