2009-05-28 4 views
1

problème1: La suppression d'un noeud dans une liste> 3C++ Suppression d'un nœud dans la file d'attente

Description:

Suppression du sixième noeud dans une liste de sept, se traduit par une impression que la première et dernier noeud.

Disponible Pointeurs Noeud: * next_, * prev_, * data_

Fonction pour supprimer le noeud spécifié est dans le LinkedList.cpp Nom: DeleteNode.

Fonction qui parcourt la liste pour imprimer les noeuds est en main.cpp Nom: PrintAllNodes

Solution possible:

pouvoir accéder current-> prev_ dans le principal lors de la traversée d'imprimer les noeuds .

code:

void LinkedList::DeleteNode(Node* node) 
{ 
    Node *Current = first_; // I want this to be my only Node Ptr Varaible Declaration. 
    if (NULL == first_) 
     std::cout << "Cannot delete from an empty list: \n"; 
//TRAVERSING WAS/IS A BAD IDEA............................. 
    while (Current != NULL) 
    { 
     if (Current->data_ == node->data_) 
     { 
      //If Current isn't the head of the list, set prev to next 
      if (Current != first_) 
      { 
       Current->prev_  = first_; //statement that follows crashes if this is not assigned. 
       Current->prev_->next_ = Current->next_; 
      } 
      else 
      { 
       first_ = Current->next_; 
       if (first_ != NULL) 
       first_->prev_ = NULL; 
      } 

      //If Current isn't the tail of the list, set next to prev 
      if (Current->next_ != NULL) 
       Current->next_ = Current->prev_; 

      else if (Current->prev_ != NULL) 
      Current->prev_->next_ = NULL; 

      listLen_--; 
      delete Current; 
      Current = NULL; 
     } 
     else 
     { 
      Current->prev_ = Current; 
      Current = Current->next_; 
     } 
    } 
    return; 
} 

Code pour PrintAllNodes dans main.cpp:

void PrintAllNodes(LinkedList *LinkedObject, long length = 0) 
{ 
    const char *Names = NULL; 
    length = LinkedObject->GetListLength(); 
    Node *GetNode = LinkedObject->GetFirstNode(); 

    for (signed short x = 0; x < length; x++) 
    { 
     Names = static_cast< NameObject* >(GetNode->data_)->GetName(); 
     cout << Names << endl; 
     GetNode = GetNode->next_; // traversing 
    } 
    return; 
} 
+0

Question? Vous pourriez ajouter de la valeur à votre question si vous pouviez en fait paraphraser la question des devoirs et indiquer ce qui semble être le problème au lieu de copier/coller et attendre que d'autres personnes résolvent. – stefanB

Répondre

2

Ceci est votre problème:

Current->prev_ = first_; 

Ce que vous faites est de déconnecter tous les nœuds avant courant et reliant le premier au dernier! (Septième dans votre cas)

Ce que vous devez faire il y a seulement:

Current->prev_->next_ = Current->next_; 
Current->next_->prev_ = Current->prev_; //I think you forgot this 
delete Current; 
Current = NULL; 

Si sans

Current->prev_ = first_; 

vous obtenez un accident, c'est parce que votre current-> prev_ ISN » t bien affecté. Mais l'affecter à first_ n'est pas la solution. Vous devriez vérifier vos autres méthodes (peut-être le AddNode) pour voir pourquoi votre Current-> prev_ est mauvais.

Questions connexes