2013-02-15 2 views
0

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; 
} 
+0

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. –

+0

Avez-vous essayé * le débogage *? En d'autres termes, avez-vous parcouru le code pour voir ce qu'il faisait? – crashmstr

+0

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. –

Répondre

0

Vous avez courant-> dans votre intérieur pour la boucle, et dans l'autre à l'intérieur pour la boucle. Je suppose que vous avez vraiment current = current-> lien dans la boucle for ou il ne fait rien. Si c'est le cas, vous sauteriez tous les autres éléments.

Vous avez également un problème de langage: vous ne créez pas de nouveaux nœuds, vous modifiez les nœuds de votre liste d'origine. Cela signifie que vous modifiez la liste au fur et à mesure que vous la parcourez, ce qui corrompra la liste au fur et à mesure que vous la triez. Le comportement n'est pas défini et dépend de l'ordre dans lequel vous ajoutez des éléments.

+0

Oui, le deuxième point est important. Le problème est un malentendu fondamental des pointeurs, cela ressemble un peu à une traduction de Java sans succès. – us2012

+0

Cela causerait aussi un problème en Java, puisque tout est une référence. Mais oui, cela a l'odeur du travail à la maison, alors c'est probablement l'OP ne comprenant pas les pointeurs. Ce qui est bien, tant qu'il demande réellement les bons suivis et apprend. –

+0

Oui, je comprends Java, et j'ai juste commencé à prendre cette classe en C++ donc je suis toujours confus au sujet des pointeurs. Donc, dois-je créer un nouveau nœud dans la boucle externe pour l'ajouter à la nouvelle LinkedList? Et si je crée un nouveau noeud avec le même objet, comment pourrais-je m'y prendre? J'ai un constructeur de copie dans ma classe Node mais je ne suis pas sûr de savoir comment l'utiliser. –

0

Même après avoir corrigé les problèmes de gestion de liste liée (que je n'ai pas examinés), votre fonction compareName() a un défaut - en comparant Person objets qui ont le même nom de famille, il peut retourner de la fonction sans fournir un valeur (dans les cas où Name.compare(p.fName) <= 0). Obtenir un résultat indéterminé à partir de la fonction de comparaison cassera à peu près n'importe quel type.

Puisqu'il s'agit probablement de devoirs, je vais laisser corriger le problème comme un exercice.

+0

Ok, donc j'ai ajouté else return -1; pour les instances où fName.compare (p.fName) <= 0 –

+0

@KristyB: vous devez retourner 0 dans le cas où 'fName.compare (p.fName) == 0'. –

+0

Ahh je vois. Manqué celui-là –