簡體   English   中英

C 雙循環鏈表刪除

[英]C Doubly Circular Linked List Deletion

我在從循環雙向鏈表中刪除時遇到問題。 我嘗試了這里提到的各種不同的方法,但它們都會導致某種錯誤。 在這里,我收到一條錯誤消息“在 tcache 2 中檢測到雙重空閑”

void delete_list(Node *node)
{
        Node *pt;
        while(node != NULL){
                pt = node;
                node = node->next;
                free(pt);
        }
}

我在從循環雙向鏈表中刪除時遇到問題

循環雙向鏈表沒有數據成員next等於NULL的節點。 其數據成員中的tail節點next具有head節點的地址。

因此,如果您的列表不為空,那么此 function

void delete_list(Node *node)
{
        Node *pt;
        while(node != NULL){
                pt = node;
                node = node->next;
                free(pt);
        }
}

在它從tail節點移動到嘗試釋放兩次的head節點后調用未定義的行為。

function可以看下面的方式(未經測試)

void delete_list( Node **head )
{
    if ( *head )
    {
        Node *current = ( *head )->next;
     
        while ( current != *head )
        {
            Mode *tmp = current;
            current = current->next;
            free( tmp );
        }

        free( *head );
        *head = NULL;
    }
}

如果主要你有一個聲明

Node *head = NULL;
//...

那么 function 可以這樣稱呼

delete_list( &head );

請注意,function 如果與指向頭節點的指針分開聲明,則不處理指向尾節點的指針。

在這種情況下,您需要引入另外一種結構,例如

struct CircularList
{
    Node *head;
    Node *tail;
};

這確實定義了一個列表。 並為這種類型的 object 調用(修改的)function。

釋放雙向鏈表中的節點不會從列表中刪除該節點。

代碼必須更正列表中前一個節點的'next'字段並更正列表中下一個節點的'prev'字段,以便這些字段跳過要刪除的節點,然后可以將要刪除的節點傳遞給free()

void delete_list(Node **head){
        Node *current, *garbage;

        if (*head==NULL) return; else current=(*head)->next;

        while(current != *head){
                garbage=current;
                current = current->next;
                free(garbage);
        }

        free(current);
        *head=NULL;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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