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;
}
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
J'ai fait les modifications. – Nathan
Les lire. Trop de code et de nombreux bugs. Difficile à réduire à celui qui vous cause actuellement du chagrin. – user4581301