[英]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.