0
votes

C Doubly Circular Linked List Suppression

J'ai un problème de suppression d'une liste circulaire doublement liée. J'ai essayé diverses méthodes différentes mentionnées ici, mais elles causent tous une sorte d'erreur. Ici, je reçois une erreur disant "Double libre détecté dans TCACHA 2"

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


2 commentaires

@ ProudFrog1337 Fournissez un programme complet minimal qui reproduit le problème.


Ce n'est pas un exemple de reproductible minimal mais le problème est évident: vous avez une liste circulaire et vous vérifiez Pour un null qui n'existe pas et éventuellement nœud retour à la mémoire précédemment libre. Définissez le nœud nœud-> prev-> Suivant Pointeur sur NULL, puis exécutez votre traversé.


3 Réponses :


2
votes

J'ai un problème de suppression de une liste circulaire doublement liée

une liste circulaire doublement liée n'a pas de nœud avec l'élément de données suivant qui est égal à null . Le nœud queue dans son élément de données suivant a l'adresse du nœud tête .

donc si votre liste n'est donc pas vide alors cette fonction xxx

invoque le comportement indéfini après son passage du nœud de la queue sur le nœud de la tête libérer deux fois.

La fonction peut rechercher des exemples de la manière suivante (sans test) xxx

si dans la principale que vous avez une déclaration comme xxx

puis la fonction peut être appelée comme xxx

fais attention à la fonction ne gère pas le pointeur du noeud queue S'il est déclaré séparé séparément à part le pointeur sur le nœud de tête.

Dans ce cas, vous devez introduire une structure supplémentaire comme par exemple xxx

que définit en effet une liste. Et appelez la fonction (modifiée) pour un objet de ce type.


2 commentaires

Désolé je suppose que j'ai mal compris l'idée de ce que fait libre. Je pensais que cela définirait automatiquement la valeur libérée à NULL. J'ai essayé à nouveau en ajoutant "noeud-> précédent-> suivant = null" et je reçois maintenant une défaillance de segmentation. Je suppose que l'erreur vient d'ailleurs?


@ Proudfrog1337 Je pense que c'est une approche invalide. Insérez une sortie de test de valeurs stockées dans des nœuds supprimés.



0
votes

Free'ing'ing un nœud dans une liste doublement liée ne supprime pas ce nœud de la liste.

Le code doit corriger le champ "Suivant" du noeud antérieur dans la liste et corriger le champ "prev" du nœud suivant dans la liste afin que ces champs ignorent le nœud à supprimer, puis le nœud à supprimer peut être utilisé. transmis à gratuit ()


0 commentaires

0
votes
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;
}

1 commentaires

Node-> Prev-> Suivant = NULL; RISQUES NODE-> PREV-> Suivant Etre null .