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); } }
3 Réponses :
J'ai un problème de suppression de
une liste circulaire doublement liée forte> p> une liste circulaire forte> forte> doublement liée n'a pas de nœud avec l'élément de données
suivant code> qui est égal à
null code>. Le nœud code> queue code> dans son élément de données
suivant code> a l'adresse du nœud code> tête code>. P>
donc si votre liste n'est donc pas vide alors cette fonction p>
xxx pré> invoque le comportement indéfini après son passage du nœud code> de la queue code> sur le nœud code> de la tête code> libérer deux fois. p>
La fonction peut rechercher des exemples de la manière suivante (sans test) p>
xxx pré> si dans la principale que vous avez une déclaration comme p >
xxx pré> puis la fonction peut être appelée comme p>
xxx pré> 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. p>
Dans ce cas, vous devez introduire une structure supplémentaire comme par exemple p>
xxx pré> que définit en effet une liste. Et appelez la fonction (modifiée) pour un objet de ce type. P> blockQuote>
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.
Free'ing'ing un nœud dans une liste doublement liée ne supprime pas ce nœud de la liste. P>
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 () code> p>
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; }
Node-> Prev-> Suivant = NULL; CODE> RISQUES
NODE-> PREV-> Suivant code> Etre
null code>.
@ 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 code> retour à la mémoire précédemment libre. Définissez le nœud
nœud-> prev-> Suivant code> Pointeur sur NULL, puis exécutez votre traversé.