2015-10-26 1 views
-2

Je travaille sur une fonction de recherche pour rechercher une valeur spécifique dans une liste chaînée. Quand il trouve cette valeur, je veux sortir sa position. Je n'arrive pas à dépasser le premier nœud sans avoir d'erreur. Je pense que quelque chose ne va pas avec les boucles mais je ne sais pas quoi.Fonction de recherche - Liste chaînée

int NumberList::search(double num) 
{ 
    ListNode *nodePtr; 
    nodePtr=head; 
    int i=0; 
    while (nodePtr->value!= NULL) 
    { 
     i=i+1; 
     if (nodePtr->value==num) 
      return i; 
     else 
      nodePtr=nodePtr->next; 
    } 
    return 0; 
} 
+3

si 'nodePtr' est' null' ?! –

+1

vous devriez dire quelle erreur vous obtenez – pm100

+1

Publiez un [MCVE] lorsque vous demandez ce type de diagnostic d'erreur ici s'il vous plaît. Sinon, votre question est hors sujet. –

Répondre

1

Votre boucle while est incorect. Vous devriez tester que nodePtr n'est pas NULL

while (nodePtr != NULL) 
{ 
    i = i + 1; 
    if (nodePtr->value == num) 
     return i; 
    else 
     nodePtr = nodePtr->next; 
} 

Aussi c'est une raison parfaite d'utiliser nullptr au lieu de NULL lorsqu'ils traitent avec des pointeurs. Si vous aviez utiliser nullptr puis

while (nodePtr->value!= nullptr) 

Souhaitez-vous donner une erreur de compilation que vous ne pouvez pas comparer un double-nullptr

+0

nodePtr pourrait être un nœud sentinelle où nodePtr-> value == NULL –

+0

merci !! cela a aidé! J'ai dû réparer ceci et quelque chose d'autre dans ma classe. –

+0

@ DieterLücking Oui, mais puisque l'OP compare 'value' à' num', je suppose que 'value' est un type non pointeur. – NathanOliver

0

Votre tout état de boucle doit être:

while (nodePtr != NULL) 

En raison de cette erreur vous sont susceptibles de visiter un nœud dont le pointeur est NULL Et en déréférenciant cela, vous causez undefined comportement.

0

Vous ne montrez pas le type ListNode mais je suppose que le value est un double.

while (nodePtr->value != NULL)

Vous êtes ici vérifier si le double n'est pas NULL (NULL est essentiellement 0). Mais vous devez tester nodePtr contre NULL.

Note: Pensez à utiliser nullptr au lieu de NULL, nullptr est le type valeur sûre pour un pointeur nul et aurait produit une erreur de compilation.

error: invalid operands of types 'double' and 'std::nullptr_t' to binary 'operator=='

1

Je ne sais pas comment la classe correspondante est définie mais je pense que dans tous les cas, la fonction doit regarder la façon suivante

int NumberList::search(double num) 
{ 
    ListNode *nodePtr = head; 
    int i = 0; 

    while (nodePtr != NULL && nodePtr->value != num) 
    { 
     ++i; 
     nodePtr = nodePtr->next 
    } 

    return nodePtr != NULL ? ++i : 0; 
} 

Il est difficile de comparer exactement deux nombres à virgule flottante. Vous devriez utiliser une méthode de comparaison qui prend par exemple en compte un epsilon.

Veuillez également prendre en compte que d'autres fonctions comme par exemple la fonction qui ajoute à la liste des noeuds peuvent aussi se tromper. :)

+0

indice # 1: 'num' est' double'. indice n ° 2: comparer le point flottant ... –

+0

@ AndreyBenkovsky J'ai ajouté mon post. –