[英]Deleting a node from a 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);
}
}
有幾個錯誤:
該節點可能是頭部,因此應返回struct student_record_node*
,而不是void
。
節點可能為NULL
如果node->prev_
為NULL
,請確保釋放已刪除的節點。
由於您未提供鏈接列表的外觀,因此在我的代碼示例中,我假設它是一個結構,其中包含指向鏈接列表(第一個元素)的head
的指針。 由your_list
。
問題出在代碼的前兩個if
-blocks之內。
第一個if
: if(!node->next_ && !node->prev_)
:
這意味着您將刪除列表的開頭元素。 在這種情況下,您將必須將head顯式設置為NULL
,而不是將要刪除的節點的指針設置為NULL
(通過將其設置為其前身NULL
)。 另外,您還可以通過釋放前一個節點來釋放NULL
指針。 這本身並不是問題,但是您想刪除node
,而不是它的前身。
第二個if
: if(!node->prev_ && node->next_)
:
這意味着您正在刪除頭,但是刪除節點后列表將不會為空。 在這種情況下,必須將列表的頭部設置為指向新的頭部,該頭部將是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.
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.