Je pose une question sur Hackerrank, mais chaque fois que je compile mon code, il montre que le contrôle atteint à la fin de la fonction non-vide. Voici mon code source:
/*
Compare two linked lists A and B
Return 1 if they are identical and 0 if they are not.
Node is defined as
struct Node
{
int data;
struct Node *next;
}
*/
int CompareLists(Node *headA, Node* headB)
{
if(headA==NULL&&headB==NULL)
{
return 1;
}
else if( headA!=NULL&&headB!=NULL)
{
while(headA!=NULL&&headB!=NULL)
{
if(headA->data==headB->data)
{
headA=headA->next;
headB=headB->next;
}
else
{
return 0;
exit (0);
}
return 1;
}
}
else
{
return 0;
}
}
S'il vous plaît dites comment remédier à cela et merci d'avance.
Réponses:
2 pour la réponse № 1Je peux voir deux problèmes d'accessibilité ici. D'abord le simple:
{
return 0;
exit (0);
}
le exit
L'appel est inaccessible. (Cette ligne est presque certainement une erreur. Je ne peux penser à aucune bonne raison d’appeler exit
Là.)
Suivant le plus compliqué ... c'est la cause première de l'erreur de compilation:
while(headA!=NULL&&headB!=NULL)
{
if(headA->data==headB->data)
{
headA=headA->next;
headB=headB->next;
}
else
{
return 0;
exit (0);
}
return 1;
}
Regardez où le return 1;
est. C'est dans la boucle.
Alors, que se passe-t-il si headA != NULL && headB != NULL
évalue à faux? Dans ce cas, le corps de la boucle avec le return 1;
à la fin est ignorée ... et vous atteignez la fin de la méthode.
D'où l'erreur de compilation.
Je soupçonne que le «correctif» consiste à déplacer le return
après la boucle, mais je n’ai pas essayé de comprendre la logique de votre code, donc cela pourrait être le "correct" correct.
0 pour la réponse № 2
Que se passe-t-il après l'exécution de ce code?
if(headA->data==headB->data)
{
headA=headA->next;
headB=headB->next;
}
...si headA->next == NULL
ou headB->next == NULL
?