2013-06-15 1 views
0

J'ai donc le problème suivant: j'ai besoin de comparer la première lettre de deux chaînes d'une structure pour voir si l'une est plus grande que l'autre. L'objectif de ceci est de mettre en œuvre dans l'algorithme de bubblesort afin que je puisse commander la structure. Jusqu'à présent, je suis venu par cette ligne:Comparer la première lettre d'une chaîne dans une structure

if (strcmp (j-> nom, j-> proximo-> name)> 0)

mais cette ligne compare le tout le contenu dans la chaînes j'ai besoin seulement de la première lettre des deux.

le code complet est ci-dessous

struct s_Especialidade{ 
    int id; 
    char nome[60]; 
    char descricao[60]; 
    struct s_Especialidade *proximo; 
}; 

void ordenarMedicoN(){ 
    PESPECIALIDADE i = malloc (sizeof(Especialidade)); 
    PESPECIALIDADE j = malloc (sizeof(Especialidade)); 
    PESPECIALIDADE t = malloc (sizeof(Especialidade)); 
    for(i=cabecaEspecialidade; i->proximo != NULL; i=i->proximo) { 
     for(j=cabecaEspecialidade; j->proximo != NULL; j=j->proximo) { 
      if(strcmp(j->nome[0],j->proximo->nome[0])>0) { 
       t = j; 
       j = j->proximo; 
       j->proximo = t; 
      } 
     } 
    } 
    main(); 
} 
+1

'si (j-> nom [0]> j-> proximo-> nom [0])'. –

+0

Thx mais cela me donne un code d'erreur "main.c: 408: avertissement: passer l'argument 1 de 'strcmp' rend le pointeur de l'entier sans un cast main.c: 408: avertissement: passer l'argument 2 de 'strcmp' fait pointer d'entier sans un casting "et je ne sais pas pourquoi. –

+3

Il n'y a pas de 'strcmp' dans mon état. Je compare les 'char's avec'> '. –

Répondre

1

Votre code est une fuite de mémoire.

Il n'est jamais correct de commencer par malloc(), puis d'affecter une autre adresse au même pointeur, qui perd la référence à la mémoire allouée par malloc().

En outre, pensez à utiliser qsort() de la bibliothèque standard pour faire le tri, il est parfaitement capable de trier n'importe quel tableau une fois que vous avez écrit la fonction de comparaison appropriée, et il sera probablement plus rapide que votre algorithme.

De plus, il est déjà écrit et débogué.

0

Étant donné la structure de votre code actuel, vous devez changer la comparaison à quelque chose comme ce qui suit:

if(j->nome[0][0] > j->proximo->nome[0][0]) 

Cet extrait de code comparera la valeur ASCII du premier caractère (rappelez-vous C commence à compter de 0) de les deux chaînes.

Cependant, gardez à l'esprit les mises en garde suivantes:

  • La comparaison sera au niveau ASCII, ce qui signifie que les caractères majuscules et minuscules ne sont pas consécutifs.
  • Vous devez insérer une vérification pour j->proximo n'étant pas NULL, sinon votre code segfault.
  • Comme mentionné par d'autres, les appels à malloc semblent inutiles. En d'autres termes, lorsque vous faites j = j->proximo, vous ne copiez pas le contenu de la structure, il vous suffit de mettre à jour le pointeur.
Questions connexes