2016-11-18 2 views
0

J'essaye d'écrire la fonction pour supprimer le noeud dans la liste double liée. Mais je m'empile à la première condition où nodeToDelete est aussi head. lorsque j'utilise ce code libre (nodeToDelete) ne libère pas nodeToDeleteBut nodeToDelete-> nextNode;ne peut pas libérer le noeud dans la liste double liée en C++

toute aide?

modifié: avec suppression DonT également des travaux voir capture d'écran ->https://s22.postimg.org/dff43kn9d/slide.jpg

modifier


void deleteNode(node *&head, int value) 

fixer mon code MERCI.


void deleteNode(node *head, int value) 
{ 
    node* nodeToDelete = head; 

    while(nodeToDelete != NULL) 
    { 
     if(nodeToDelete->value == value) 
     { 
      if(nodeToDelete == head) 
      { 
       head = nodeToDelete->nextNode; 
       head->previousNode = NULL; 
       delete nodeToDelete; 
       return; 
      } 

     } 

     nodeToDelete = nodeToDelete->nextNode; 
    } 
} 
+2

Vous devriez vraiment utiliser 'new' et' delete' en C++ si vous avez à faire l'allocation de mémoire manuelle. 'malloc' et' free' ne fonctionnent pas avec les types de classes de mise en page non standard en C++. – NathanOliver

+0

Apprenez comment utiliser un débogueur et comment parcourir votre code ligne par ligne. –

+0

Oh mec !! Je vous remercie !!! J'utilise nouveau pour l'allocation de mémoire. Devrait utiliser supprimer insted of free. – pZCZ

Répondre

1

Si BANDEAUX> valeur correspond, vous changez la tête dans cette fonction, mais cela ne changera pas la tête ailleurs. L'appelant a maintenant un pointeur invalide vers un noeud supprimé, et aucun moyen de trouver les noeuds réels. C'est probablement ce pointeur invalide qui conduit à un échec d'appel ultérieur. De plus, si head-> value ne correspond pas, alors vous faites une recherche dans la liste, mais vous refusez d'en faire plus tard parce que ce n'est pas head. Il n'y a pas d'autre clause.

+0

Merci pour votre commentaire. Je corrige mon code. Je vais passer la tête par la refférence juste ajouter & pour fonctionner et son fonctionnement. – pZCZ

2

Vous avez un mauvais ordre des étapes. J'ai dessiné un croquis rapide avec des nœuds et des pointeurs et voici ce que j'ai trouvé:

D'abord vous commencez avec deux pointeurs: head et nodeToDelete qui pointent tous deux sur le nœud que vous voulez supprimer. Ensuite, pointez la tête vers le nœud suivant et annulez son pointeur sur le nœud précédent et continuez à supprimer le nodeToDelete. Jusqu'à présent, pas de problème.

mais alors cette ligne: nodeToDelete = nodeToDelete->nextNode; est problématique. Comme nodeToDelete a été libéré, vous ne pouvez plus l'utiliser et la logique elle-même ne fonctionne pas.

Je pense que la logique à suivre est:

  1. tête de point au noeud suivant.

  2. Faire BANDEAUX> point précédent à nodeToDelete-> précédent

  3. Marque nodeToDelete-> point à côté de la tête

  4. Supprimer nodeToDelete

De cette façon, vous vous avez précédente pointez vers le suivant, votre prochain pointant vers le précédent et celui entre les deux supprimé.

Quelque chose comme:

head = nodeToDelete->next; 
head->previous = nodeToDelete->previous; 
nodeToDelete->next = head; 
delete(nodeToDelete); 

while(nodeToDelete != NULL) n'est pas nécessaire, vous pouvez vérifier avec un if si vous voulez, mais en boucle ce n'est pas une bonne idée.

Voici un dessin glorieux que j'ai fait, maybee ça va aider un peu. Désolé, je suis vraiment mal ...

enter image description here