本文共 1270 字,大约阅读时间需要 4 分钟。
由于你没有提供,你的链表是什么样的,我将假设我的代码示例,它是一个包含指向链表的 head (第一个元素)的指针的结构 . 它由 your_list 引用 .
问题在于代码中的前两个 if -blocks;
第一个 if : if(!node->next_ && !node->prev_) :
这意味着您要删除列表的head元素 . 在这种情况下,您必须将头显式设置为 NULL ,而不是将指向要删除的节点的指针设置为 NULL (通过将其设置为其前一个,即 NULL ) . 此外,通过释放前一个节点,您可以释放 NULL -Pointer . 这是自己不是问题,但你想删除 node ,而不是它的前身 .
第二个 if : if(!node->prev_ && node->next_) :
这意味着您要删除头部,但删除节点后列表不会为空 . 在这种情况下,您必须将列表的头部设置为指向新头部,该头部将是 node->next_ 指向的节点 . 此外,您与之前的 free() 有类似的问题 .
解决这两点,您的代码应该按照以下方式执行:
void removeNode(struct student_record_node *node){
if(!node->next_ && !node->prev_){
your_list->head = NULL; // Remove head - List is now empty.
student_record_node_deallocate(node);
node = NULL; // Set freed pointer to NULL, for safety.
}
else if(!node->prev_ && node->next_){
your_list->head = node->next_; // Set the head to the new head.
student_record_node_deallocate(node);
node = NULL; // Set freed pointer to NULL, for safety.
}
else if(node->next_ && node->prev_){
node->prev_->next_ = node->next_;
node->next_->prev_ = node->prev_;
student_record_node_deallocate(node);
node = NULL; // Set freed pointer to NULL, for safety.
}
else if(node->prev_ && !node->next_){
node->prev_->next_ = NULL;
student_record_node_dealocate(node);
node = NULL; // Set freed pointer to NULL, for safety.
}
}
转载地址:https://blog.csdn.net/weixin_33613462/article/details/114202773 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!