J'essaie d'écrire une méthode pour ma classe LinkedList qui va trier une liste chaînée d'objets Person par leur nom. Ma méthode compile bien mais quand j'essaye de trier une liste de personnes, la sortie est incorrecte. Il ne s'arrête jamais non plus. Par exemple, ce codeTri d'insertion avec une liste individuellement chaînée en C++
Person *p1 = new Person("Kirstie", "Booras");
Person *p2 = new Person("Alex", "Arosenius");
Person *p3 = new Person("Stephanie", "Moewe");
Person *p4 = new Person("Bella", "Moewe");
LinkedList ll;
ll.insertFront(*p1);
ll.insertFront(*p2);
ll.insertFront(*p3);
LinkedList newList = ll.insertionSort();
newList.print();
cout << endl;
donne cette sortie
Booras, Kirstie
Arosenius, Alex
Quelqu'un pourrait-il me aider à comprendre où je suis allé mal avec mon algorithme? Merci!
C'est la méthode que j'utilise pour trier les noms par la première et dernière:
int Person::compareName(Person p)
{
if (lName.compare(p.lName) > 0)
{
return 1;
}
else if (lName.compare(p.lName) == 0)
{
if (fName.compare(p.fName) > 0)
{
return 1;
}
else return -1;
}
else return -1;
}
insertion Méthode de tri:
LinkedList LinkedList::insertionSort()
{
//create the new list
LinkedList newList;
newList.front = front;
Node *n;
Node *current = front;
Node *trail = NULL;
for(n=front->link; n!= NULL; n = n->link)//cycle through old chain
{
Node* newNode = n;
//cycle through new, sorted chain to find insertion point
for(current = newList.front; current != NULL; current = current->link)
{
//needs to go in the front
if(current->per.compareName(n->per) < 0)
{
break;
}
else
{
trail = current;
}
}
//if it needs to be added to the front of the chain
if(current == front)
{
newNode->link = newList.front;
newList.front = newNode;
}
//else goes in middle or at the end
else{
newNode->link = current;
trail->link = newNode;
}
return newList;
}
Titre modifié; Même si je n'ai pas examiné les détails, je soupçonne que cela va être un problème d'algorithme plutôt qu'un problème de langage, alors je ne suis pas sûr que cela compte beaucoup. –
Avez-vous essayé * le débogage *? En d'autres termes, avez-vous parcouru le code pour voir ce qu'il faisait? – crashmstr
Oh mon garçon. Quand je lis votre code, j'ai la tentation de l'écrire pour vous, au lieu d'essayer de comprendre ce que vous faites ici. Ce serait beaucoup plus rapide et plus facile. Votre code vient de cuire mes nouilles. Votre méthode 'compareName' n'est pas correcte, mais elle donne des résultats corrects pour l'exemple fourni, donc le problème n'est pas là. Veuillez détacher un élément de l'ancienne liste et l'attacher au nouveau au bon endroit, au lieu d'essayer de relier un lien de rupture de liste dans le processus. Eh bien c'est ce que je pense que vous faites, mais je ne peux pas vraiment dire à coup sûr. –