由于你沒有提供,你的連結清單是什麼樣的,我将假設我的代碼示例,它是一個包含指向連結清單的 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.
}
}