IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Recherche dans une liste Chainée


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Haïti

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 29
    Points : 38
    Points
    38
    Par défaut Recherche dans une liste Chainée
    Salut les gars,
    J'écris une fonction de recherche dans une liste chainée. Le but est de faire une recherche par titre. Donc je recherche une chaine de caractère dans cette liste.Mais cela me donne une erreur logique.
    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    int search_by_titre(Controle* liste_musique,char *titre)
    {
        Musique *tempo=liste_musique->debut;
        char *titre_cp,*titre_cp2;
        if((titre_cp=(char *)malloc(18*sizeof(char)))==NULL)return -1;
        if((titre_cp2=(char *)malloc(18*sizeof(char)))==NULL)
        {
            free(titre_cp);
            return -1;
        }/*titre_cp recoit le titre que l'on veut rechercher*/
        strcpy(titre_cp,titre);
        titre_cp=toupper_text(titre_cp);
        printf("%s",titre_cp);system("pause");
        int asd=3;
        while(tempo!=NULL||asd!=0)
        {
            strcpy(titre_cp2,tempo->titre);
            titre_cp2=toupper_text(titre_cp2);
            asd=strcmp(titre_cp2,titre_cp);
            printf("%d",asd);
            printf("%p",tempo);system("pause");
            printf("%s\n",titre_cp2);system("pause");
            printf("%p",tempo);system("pause");
            tempo=tempo->next_one;
        }
        if(asd!=0)
        {
            printf("\tMusique introuvable\n");
        }
        else
        {
            //printf("\t")
            //affichage de la musique
        }
        return 0;
    }
    J'ai utiliser les printf juste pour débuger un peu.
    Merci déjà pour votre aide et tout amélioration..

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Il faudrait clean un peu cela déjà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while(tempo!=NULL||asd!=0)
    en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while((tempo != NULL) || (asd != 0))
    On est sûr de la comparaison !

    Ensuite, toujours à cet endroit...
    il me semble que tu devrais essayer une conjonction !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while((tempo != NULL) && (asd != 0))
    La boucle DOIT se faire SI tempo != NULL ET que l'on ne trouve pas ton mot...
    CAD : la boucle s'arrête SI tempo == NULL OU ton mot est trouvé !

    Mais ne t'inquiète pas, la logique c'est à devenir chauve à certains moments...
    (j'espère même ne pas m'être trompé moi-même)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Pourquoi caster le retour de malloc ? Si c'est à cause d'un warning, c'est que tu ne compiles pas avec un compilo C.

    Par contre bravo pour le free si le 2e malloc échoue, bien trop peu de gens pensent à le faire !

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2013
    Messages : 42
    Points : 80
    Points
    80
    Par défaut ADT
    Les algorithmes de recherches sont intimement liés a la structure des donnés ( lineaire , binaire, arbre ...), et le genre de donnés (bon ici il s agit des strings) , et la maniere donc les donnés sont enregistré (suivant un certains ordre (ou pas) , logique ou pas)

    1 - il serait deja bien de faire une fonction pour hasher les donnés .
    2 - Ainsi affecter des index a tes strings .

    C est la seule maniere efficace , et rapide ( surtout conseillé ) d implementer un algorithme de recherche dans un ADT.

    Bien a toi .

  5. #5
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonjour,

    tu fais beaucoup de copies de chaînes. Une copie du paramètre que tu transformes en majuscules, une copie de la chaîne candidate que tu transformes aussi en majuscules puis tu compares les deux ce qui te permet d'être indépendant de la casse.
    Une solution plus simple aurait été d'utiliser strcasecmp. Plus simple dans le sens ça simplifie ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    int search_by_titre(Controle* liste_musique,char *titre)
    {
        Musique *tempo=liste_musique->debut;
        printf("%s",titre);system("pause");
        int asd=3;
        while( (tempo!=NULL) && (asd!=0) )
        {
            asd=strcasecmp(tempo->titre,titre);
            tempo=tempo->next_one;
        }
        if(asd!=0)
        {
            printf("\tMusique introuvable\n");
        }
        else
        {
            //printf("\t")
            //affichage de la musique
        }
        return 0;
    }

Discussions similaires

  1. Recherche dans une liste chainée
    Par reyo47 dans le forum C
    Réponses: 3
    Dernier message: 02/06/2014, 00h02
  2. fonction de recherche dans une liste chainée
    Par seifvai dans le forum C
    Réponses: 10
    Dernier message: 23/12/2007, 10h35
  3. récupérer un objet dans une liste chainée
    Par marsuwhite dans le forum Langage
    Réponses: 4
    Dernier message: 05/06/2006, 14h05
  4. Réponses: 2
    Dernier message: 10/10/2005, 02h25
  5. Recherche dans une liste non trié
    Par Oberown dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 13/09/2004, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo