2013-04-13 8 views
1
protected void sortHorseList(int iHorseCount) 
{ 
    int i = 0; 
    Horsie currentNode = head; 
    Horsie auxNode = new Horsie(); 
    boolean foundChange = true; 
    while(foundChange) 
    { 
     foundChange = false; 
     for(i=0; i<iHorseCount-1; i++) 
     { 
      if (currentNode.getHorseValue() > currentNode.getNext().getHorseValue()) 
      { 
       auxNode.setHorseValue(currentNode.getHorseValue()); 
       currentNode.setHorseValue(currentNode.getNext().getHorseValue()); 
       currentNode.getNext().setHorseValue(auxNode.getHorseValue()); 
       foundChange = true; 
      } 
      currentNode = currentNode.getNext(); 
     } 
    } 
} 

Ce code affiche une erreur de pointeur NULL lors de l'exécution du programme principal. Je suis un novice en structure de données, et j'espère résoudre ce problème avec votre aide les gars! S'il vous plaît apprenez-moi comment utiliser bulle trier dans un liste doublement liée ... HEEELP!Trier Bubble en double liste chaînée - pointeur nul erreur

+0

Veuillez marquer avec le langage de programmation approprié. –

+0

Quelle ligne renvoie l'exception NullPointerException? – RyPope

+0

Travail à domicile? Personne ne trie les listes liées, et personne n'utilise le tri des bulles en dehors de l'université. – EJP

Répondre

1

Lorsque vous arrivez à la fin de la liste, vous ne vérifiez pas si un élément suivant existe. Ainsi, lorsque vous tentez d'accéder à sa valeur, vous obtenez l'exception de référence nulle. Votre boucle intérieure devrait ressembler à quelque chose comme

Horsie currentNode = head; 
    Horsie nextNode = currentNode != null ? currentNode.getNext() : null; 
    while (currentNode != null && nextNode != null) 
    { 
     if (currentNode.getHorseValue() > nextNode.getHorseValue()) 
     { 
      currentNode = Swap(head,currentNode,nextNode); 
      foundChange = true; 
     } 
     else 
     { 
      currentNode = nextNode; 
     } 
     nextNode = currentNode.getNext(); 
    } 

Swap(Horsie current, Horsie next) échanges le lieu de current et next dans la liste et, le cas échéant, mises à jour la tête si current était le nœud principal.

do voulez échanger les nœuds de la liste plutôt que d'échanger les valeurs entre les nœuds sauf si vous êtes sûr que votre liste contient les seules références aux objets de nœud. Si vous ne le faites pas, vous risquez de faire muter de façon inattendue un objet détenu par une autre classe, car vous avez modifié sa valeur pendant le tri.

+0

Pouvez-vous s'il vous plaît m'aider avec la méthode d'échange? Comment puis-je démarrer la méthode? –

+0

@VincentSy - vous avez juste besoin de fixer les pointeurs (avant) de sorte que le parent 'current' pointe vers' next', 'next' pointe vers' current', et 'current' pointe vers' next' disciple. De même avec les pointeurs arrière. Vous devrez également gérer les cas spéciaux où 'current' est l'élément' head' ainsi que 'next' est la queue. – tvanfosson

+0

Comment puis-je le faire? Pouvez-vous me donner les codes pour cela? (DÉBUTANT): \ –