簡體   English   中英

從雙向鏈表中刪除節點

[英]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);
    }
}

有幾個錯誤:

  1. 該節點可能是頭部,因此應返回struct student_record_node* ,而不是void

  2. 節點可能為NULL

  3. 如果node->prev_NULL ,請確保釋放已刪除的節點。

由於您未提供鏈接列表的外觀,因此在我的代碼示例中,我假設它是一個結構,其中包含指向鏈接列表(第一個元素)的head的指針。 your_list

問題出在代碼的前兩個if -blocks之內。

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

    這意味着您將刪除列表的開頭元素。 在這種情況下,您將必須將head顯式設置為NULL ,而不是將要刪除的節點的指針設置為NULL (通過將其設置為其前身NULL )。 另外,您還可以通過釋放前一個節點來釋放NULL指針。 這本身並不是問題,但是您想刪除node ,而不是它的前身。

  • 第二個ifif(!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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM