2016-10-31 1 views
-3

J'ai écrit un programme pour faire une liste chaînée des noms et des âges des présidents. J'ai réussi à faire la liste et l'ai imprimé pour vérifier et voir si tout fonctionne bien. Je voulais maintenant parcourir la liste et supprimer les données qui étaient incomplètes.C++ Pourquoi cette fonction d'impression ne fonctionne-t-elle pas après un parcours de liste chaînée et une suppression pour certains nœuds?

Ma principale préoccupation est après que les suppressions sont faites, la fonction d'impression donne une erreur intitulée "erreur de lecture des caractères de chaîne". Cela peut donc signifier que la tête de la liste est maintenant à la fin et imprime donc au-delà de la portée de la liste. Mon autre souci est que je n'ai peut-être pas supprimé le noeud et reloué la liste correctement. Y a-t-il une meilleure manière de faire cela? Est-ce que quelqu'un peut clarifier la logique de pseudocode pour à la fois parcourir une liste chaînée déjà créée, supprimer des nœuds, et faire en sorte que la nouvelle liste soit liée?

// void president cleaning up linked list removes incomplete entries and 
    void President::RemovingIncompleteEntries() 
    { 
     // make a node called delete 
     Presidentnode * deletenode; 
     Presidentnode * current = head; 
     Presidentnode * previous = current; 
     // while the current has a value 
     while (current->next != NULL) 
     { 
      string CurrentTotal = current->LastName + " " + current->FirstName + " " + current->age; 
      string CurrentNextTotal = current->next->LastName + " " + current->next->FirstName + " " + current->next->age; 
      if (CurrentTotal == CurrentNextTotal) 
      { 
       cout << "[[" << current->FirstName << " " << current->LastName << "] was deleted for being a duplicate]" << endl; 
       // sets deletenode to current (will be deleted) 
       deletenode = current; 
       // traverses the next node 
       current = current->next; 
       // sets the previous nexts pointer at the next current 
       previous->next = current->next; 
       // deletes the deletenode; 
       delete (deletenode); 
      } 
      else if ((current->FirstName == current->LastName) || (current->FirstName == current->age)) 
      { 
       // checks to see if any parts of the name equal another part of the name(helps deal with case like 52) 
       cout << "[[" << current->FirstName << " " << current->LastName << "] was deleted for having two names equal to each other]" << endl; 
       // sets deletenode to current (will be deleted) 
       deletenode = current; 
       // traverses the next node 
       current = current->next; 
       // sets the previous nexts pointer at the next current 
       previous->next = current->next; 
       // deletes the deletenode; 
       delete (deletenode); 
      } 
      else if (!(current->age.find_first_not_of("1234567890"))) 
      { 
       // checks to see if it finds a letter instead of a number (helps deal with Lucas Aubrey) 
       cout << "[[" << current->FirstName << " " << current->LastName << "] was deleted for having a missing age]" << endl; 
       // sets deletenode to current (will be deleted) 
       deletenode = current; 
       // traverses the next node 
       current = current->next; 
       // sets the previous nexts pointer at the next current 
       previous->next = current->next; 
       // deletes the deletenode; 
       delete (deletenode); 
      } 
      else{ 
       // traverse the list 
       current = current->next; 
      } 
      previous = current; 
     } 
     // show we updated the list 
     cout << "[Updated List: Incomplete Entries and Duplicates Removed]" << endl; 
    } 

    // void printlinkedlist printes presidents in order 
    void President::PrintLinkedList() 
    { 

     Presidentnode *current = head; 
     // while the head has a value 
     while (current != NULL){ 
      // prints data 
      cout << current->FirstName << " " << current->LastName << " " << current->age << endl; 
      current = current->next; 
     } 
     // show we deleted the list 
     cout << "[List Printed]" << endl; 
    } 
+0

Veuillez modifier votre message pour inclure un [mcve]. Une fois que ce lien pastebin pourrit votre question et ses réponses seront rendues inutiles. – user4581301

+0

J'ai fait les modifications. – Nathan

+0

Les lire. Trop de code et de nombreux bugs. Difficile à réduire à celui qui vous cause actuellement du chagrin. – user4581301

Répondre

0

Dans

President::President() 
{ 
    Presidentnode* head = NULL; 
} 

Presidentnode* head = NULL; déclare une variable locale nommée head qui cache President::head, donc la tête, non President::head, est NULL.

Donc, dans ReadNamesofPresidentsif (head == NULL) est un crapshoot absolue.

également garder un œil sur

while (!infile1.eof()) 

Why is iostream::eof inside a loop condition considered wrong?

Qu'est-ce qui se passe avec argv[1]? Le code insiste sur le fait qu'il doit exister, mais ne l'utilise jamais. En RemovingIncompleteEntries, la tête est perdue si le premier élément est supprimé. Deux bonnes solutions pour cela: supprimer le deuxième double plutôt que la première ou

if (deletenode == head) 
{ 
    head = current; 
} 

et faites attention à previous->next = current->next; Je ne vois pas utilisé ou utile.

+0

pourriez-vous regarder la fonction RemovingIncompleteEntries() et comment j'ai traversé et supprimé des noeuds? étais-je proche? – Nathan

+0

@NathanDrieling Assez près, la seule chose que j'ai repérée jusqu'ici est que si vous "supprimez" le premier élément de la liste, vous ne mettez pas à jour 'head' pour pointer sur l'élément suivant. – user4581301