从双向链表中删除节点

时间:2015-12-15 03:29:12

标签: c doubly-linked-list

这是我当前的代码,我已经搞砸了,所以如何处理第一项或唯一的项是错误的,这是这个功能的前两个部分。出于某种原因,如果我只是尝试设置node = node-> next_,我会得到内存错误。我会认为这将是最简单的方法,但当我把它扔回程序时,我开始得到内存访问问题。只要我不操纵头部地址,所有其他部分都能正常工作。

void removeNode(struct student_record_node* node)
{
    struct student_record_node *temp=NULL;
    temp=node;
    if(node->next_==NULL&&node->prev_==NULL)
    {
        node=node->next_
        free(node->prev_);
    }
    else if(node->prev_==NULL&& node->next_!=NULL)
    {
        node=node->next_
        free(node->prev_);
    }

    else if(node->next_!=NULL && node->prev_!=NULL)
    {
        node->prev_->next_ = node->next_;
        node->next_->prev_ = node->prev_;
        student_record_node_deallocate(node);
    }
    else if(node->prev_!=NULL&& node->next_==NULL)
    {
        node->prev_->next_=node->next_;
        student_record_node_deallocate(node);
    }
}

2 个答案:

答案 0 :(得分:1)

有几个错误:

  1. 该节点可能是头部,因此应返回struct student_record_node*,而不是void

  2. 节点可能为NULL

  3. 如果node->prev_NULL,请务必释放已删除的节点。

答案 1 :(得分:1)

由于您没有提供,链接列表是什么样的,我将假设我的代码示例,它是一个包含指向链接列表head的指针的结构(第一个元素) )。它由your_list引用。

问题在于代码中的前两个if - 块;

  • 第一个ifif(!node->next_ && !node->prev_)

    这意味着您要删除列表的head元素。在这种情况下,您必须将头部显式设置为NULL,而不是将指向您要删除的节点的指针设置为NULL(通过将其设置为其前一个,{{1} }})。此外,通过释放前一个节点,您可以释放NULL - 指针。这本身并不是问题,但你要删除NULL,而不是它的前身。

  • 第二个nodeif

    这意味着您正在删除头部,但删除节点后列表不会为空。在这种情况下,您必须将列表的头部设置为指向新头部,该头部将是if(!node->prev_ && node->next_)指向的节点。此外,您遇到与node->next_类似的问题。

解决这两点,你的代码应该按照以下方式做点什么:

free()