2017-10-09 3 views
2

Ceci est ma fonction de recherche binaire. Je n'arrive pas à trouver l'erreur mais chaque fois que j'essaie d'exécuter le code, cela me donne une erreur de segmentation 11. J'ai l'impression que mon erreur est liée à ma dernière déclaration if.Comment déterminer pourquoi un morceau de code produit une boucle infinie?

void binary(struct list *A[], char search[15], int start, int 
end) { 

    if(start <= end) { 

     int middle = (start + end)/2; 

     if(strcmp(search, A[middle]->name) == 0){ 

      printf("found"); 
      exit(0); 

     } else if (strcmp(search, A[middle]->name) > 0){ 

      int start = middle + 1; 
      int end = end; 
      binary(A, search, start, end); 

     } else if (strcmp(search, A[middle]->name) < 0){ 

      int start = start; 
      int end = middle - 1; 
      binary(A, search, start, end); 

     } else if (start == (end - 1)) { 

      printf("%s was not found in the list", search); 
      exit(0); 

     } 

    } 

} 
+3

Comment êtes-vous censé atteindre cette dernière instruction else-if si elle n'est appelée que lorsque strcmp renvoie un nombre différent de 0, inférieur à 0 ou supérieur à 0? –

+0

La liste est-elle triée par ordre ascendant ou descendant lexicographique? En outre, vous pourriez bénéficier de se débarrasser de l'extrémité int = fin; et int start = start; déclarations. Si le dernier bloc n'est pas pertinent, le message "was not found" devrait être hors de portée de votre bloc if externe. –

+1

début et fin sont des indices, donc ça ne devrait pas non? –

Répondre

1

Ces déclarations

int end = end; 
int start = start; 

ne font pas de sens parce que les variables sont initialisés par eux-mêmes alors qu'ils ont des valeurs indéterminées.

Il n'est pas nécessaire de déclarer les variables locales en fin et en début. Utilisez les paramètres

Cette déclaration

} else if (start == (end - 1)) { 

     printf("%s was not found in the list", search); 
     exit(0); 

    } 

ne fait également pas de sens parce que d'abord les variables start et end satisfont à la condition d'enfermer instruction if

if(start <= end) { 

Et enfin, il n'a pas de sens d'utiliser la norme fonction exit au lieu de la déclaration de retour ..

+0

okay maintenant ça marche mais si j'introduis quelque chose qui n'est pas dans la liste il n'imprime pas que le "% s n'a pas été trouvé dans la liste" –

+0

btw merci pour l'aide –

+0

@EthanItovitch La dernière instruction if else doit être placé en dehors de l'instruction if initiale et être son instruction else. –

0

D'abord, comme d'autres déjà souligné, l'affectation comme int end = end demande des problèmes. Faites un test simple et imprimez les valeurs start et end au début de la fonction pour voir ce qui se passe lorsque votre programme fonctionne ...

Ensuite, vous n'avez pas besoin de récursion ici! Shrinking la zone de recherche peut être facilement fait dans une boucle simple:

void binary(struct list *A[], char search[15], int start, int end) { 
    while(start <= end) { 
     int middle = start + (end - start)/2; 

     int cmpresult = strcmp(search, A[middle]->name); 
     if (cmpresult > 0) { 
      start = middle + 1; 
     } else if (cmpresult < 0) { 
      end = middle - 1; 
     } else {    // cmpresult == 0 
      printf("found at %d", middle); 
      return; 
     } 
    } 

    printf("%s was not found in the list", search); 
} 

Enfin, s'il vous plaît noter le calcul middle - l'ajout (start + end) est une étape commune de le faire, mais il peut conduire à une erreur si le tableau est trop long ; en particulier, si la longueur du réseau dépasse la moitié de la valeur maximale représentable par le type int.