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 :

Linked list: problemes avec fonction de recherche


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut Linked list: problemes avec fonction de recherche
    salut,

    j'ai un probleme avec une fonction de recherche que j'essaie de mettre dans mon programme...

    Le principe de mon prog est de lire un fichier qui contient des commandes, que ce soit des mots a ajouter ou a retirer de la liste chainees, exemple de fichier a lire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    add Jones
    add Smith
    add nom
    pause
    delete nom
    queue
    Pour l'instant j'arrive a faire toutes les commandes sauf delete. Mais avant, je dois ajouter une fonction qui pourra d'abord chercher si le mot existe avant de commencer a le supprimer, car si il n'existe pas, on peut pas le supprimer

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    # include <stdio.h>
    # include <stdlib.h>
    # include <string.h>
     
    struct record * MakeList ( void ); /* prototypes */
    struct record * MakeNode ( void );
    void LoadNode ( struct record * locn, char str [] );
    void Queue ( struct record * x );
     
     
    struct record  {
      char command [ 11 ];  /* designe "add" ou bien "delete" */
      char word [ 11 ]; /* designe le mot qui devra suivre add et delete */
      struct record * next;
      };
     
    struct record *first;
     
    int main ( void )
    {
      struct record * start;        /* beginning of the linked list        */
      start = MakeList ( );         /* Build the list                      */
      Queue ( start );         /* Display the list from the beginning */
      return 0;
    }
     
    /* Voila la Fonction recherche en question. Elle m'affiche l'erreur meme 
    si l'element selectionne existe vraiment dans la liste */
     
    struct record *find( char *word ) {
            struct record *info;
            info = first;
     
            while(info) { 
                    if(!strcmp(word, info->word)) return info; 
                    info = info->next;
                    }
            fprintf(stderr, "\nCannot find item to delete.\n");
            return NULL;
    }
     
    struct record * MakeList ( void )
    {
      FILE * sf;                    /* output file pointer         */
      char fname[31];
      struct record * start = NULL, /* @ of first node in list     */
                    * current,      /* @ of where we are at any pt */
                    * new;          /* some pointers to use later  */
      char buffer [ 81 ];           /* space for string from file  */
     
      printf(" Enter script file : "); /* le fichier avec les commandes doit etre pret */
      gets(fname); /* pour ou contre ? utiliser un fgets ? */
     
      if ( ( sf = fopen ( fname, "r" ) ) == NULL ) {
        printf ( "MAKELIST: Unable to open input file %s!\n", fname );
        exit ( 1 );
        }
     
      fgets ( buffer, 81, sf );              /* do a 'priming read'      */
      while ( ! feof ( sf ) ) {     /* read & process all file contents  */
        new = MakeNode ();
        if ( start == NULL )
          start = current = new;             /* start a new list         */
        else {
          current->next = new;               /* move pointer to new node */
          current = current->next;
          }
        LoadNode ( current, buffer );
        fgets ( buffer, 81, sf );            /* get rady for next test   */
        }
      fclose ( sf );
      return start;
    }
     
    void LoadNode ( struct record * locn, char str [] )
    { char s[40];
      struct record * start;
      if (locn->command && locn->word){
         sscanf ( str, "%s %s", locn->command, locn->word );
         }
     
       if(locn->command && !locn->word){  // process the first commands
         sscanf ( str, "%s", locn->command); 
         }
     
       if(strcmp(locn->command,"delete") == 0 ) {
         printf("==%s %s==\n",locn->command, locn->word);
         strcpy(s,locn->word);
     
         while(start) {
              if(!strcmp(s, start->word)) puts("i ve found it\n");
          current = current->next;
          }
        LoadNode ( current, buffer );
        fgets ( buffer, 81, sf );            /* get rady for next test   */
        }
      fclose ( sf );
      return start;
    }
     
     
    struct record * MakeNode ( void )
    {
      struct record * newptr;
      newptr = ( struct record * ) calloc ( 1, sizeof ( struct record ) );
      newptr->next = NULL;
      return newptr;
    }
     
    void Queue ( struct record * x )
    {
       struct record * tmp;      /* a temporary ptr used while freeing space */
     
       if ( strcmp(x->command, "queue") != 0) {
          fprintf(stderr, "Script file doesn't contain command QUEUE nor STACK.\n");
          }
     
      else {
        while ( x->next != NULL ) {
           if ( strcmp(x->command, "add") == 0 && x->word) {
                 printf ( "%s\n", x->word);
                 }
     
           else if ( strcmp(x->command,"pause") == 0 ) {
                 printf("\nTo continue press RETURN.\n");
                 getchar();
                 }
         tmp = x;
         x = x->next;
         free ( tmp );
        }
       }
      return;
    }
    Merci de votre aide

    Tout autre critique serait appreciable.

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Et tu attend qu'on la fasse pour toi ? Si tu as un problème c'est que tu l'as déjà commencé alors montre là, je ne l'ai pas vu dans ton code ! Ou bien est-ce que tu ne sais pas comment faire ? Si c'est le cas bin:

    • Tu positionnes un pointeur (par exemple dans une fonction Search) sur le début de la liste
    • Dans une boucle while tu parcours ta liste noeud par noeud et pour chaque noeud tu testes la chaîne qu'il contient avec strcmp
    • Si le noeud courant contient la chaîne, tu retournes un pointeur sur ce noeud (la fin de ta fonction Search)
    • Le noeud renvoyé tu peux maintenant le supprimer par le biais de ta fonction de supression


    Par ailleurs, je te signal que tu as deux fois la fonction LoadNode dans ton code, le compilateur risque de ne pas trop aimer ca !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Voici quelques choses à corriger:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /home/thierry/devel/SdZ/main.c: In function «LoadNode":
    /home/thierry/devel/SdZ/main.c:90: erreur: expected expression before «/" token
    /home/thierry/devel/SdZ/main.c:109: attention : «return" with a value, in function returning void
    /home/thierry/devel/SdZ/main.c:83: attention : unused variable «s"
    /home/thierry/devel/SdZ/main.c:113: erreur: redefinition of «LoadNode"
    /home/thierry/devel/SdZ/main.c:82: erreur: previous definition of «LoadNode" was here
    /home/thierry/devel/SdZ/main.c: In function «LoadNode":
    /home/thierry/devel/SdZ/main.c:115: attention : unused variable «start"
     === Build finished: 6 errors, 0 warnings ===
    Citation Envoyé par virtuadrack
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gets(fname); /* pour ou contre ? utiliser un fgets ? */
    Clairement contre! gets() est un bug et son usage est fortement déconseillé.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct record *first; // tu cherches les ennuis avec tes variables globales
    ....
    struct record *find( char *word ) {
            struct record *info;
            info = first; // et bien tu les as ! Qui a initialisé la globale first ?
    ....
    En fait, first est une variable globale initialisée à NULL lors de sa céation. Donc comme tu n'as pas mis de valeur dedans, elle reste à NULL, info vaut NULL et la boucle while n'est pas exécutée

  5. #5
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct record *first; // tu cherches les ennuis avec tes variables globales
    ....
    struct record *find( char *word ) {
            struct record *info;
            info = first; // et bien tu les as ! Qui a initialisé la globale first ?
    ....
    En fait, first est une variable globale initialisée à NULL lors de sa céation. Donc comme tu n'as pas mis de valeur dedans, elle reste à NULL, info vaut NULL et la boucle while n'est pas exécutée
    Je vois... mais quelle valeur info doit recevoir pour qu'elle reconaisse la liste qui a ete construite et ainsi y chercher un des elements?

    Merci

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par virtuadrack Voir le message
    Je vois... mais quelle valeur info doit recevoir pour qu'elle reconaisse la liste qui a ete construite et ainsi y chercher un des elements?
    info devrait être un paramètre de la fonction : On recherche un mot dans une liste -> deux paramètres pour que find travaille de façon autonome, le mot cherché et la liste à explorer
    Autres remarques :
    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
    void LoadNode ( struct record * locn, char str [] )
    { char s[40];
      struct record * start; 
      if (locn->command && locn->word){
    // ne sert à rien, toujours VRAI : évidemment que ces deux adresses ne sont pas NULL
         sscanf ( str, "%s %s", locn->command, locn->word );
         }
     
       if(locn->command && !locn->word){  // process the first commands
    // ne sert à rien : toujours FAUX
         sscanf ( str, "%s", locn->command); 
         }
     
       if(strcmp(locn->command,"delete") == 0 ) {
         printf("==%s %s==\n",locn->command, locn->word);
         strcpy(s,locn->word);
     
         while(start) {
    // start non initialisé
              if(!strcmp(s, start->word)) puts("i ve found it\n");
          current = current->next;
    // current non défini
          }
        LoadNode ( current, buffer );
        fgets ( buffer, 81, sf );            /* get rady for next test   */
        }
      fclose ( sf );
      return start;
    }

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/04/2006, 11h10
  2. C++ - Probleme avec fonction virtuelle
    Par vdumont dans le forum C++
    Réponses: 1
    Dernier message: 20/03/2006, 20h49
  3. probleme avec fonctions
    Par Burinho dans le forum C
    Réponses: 8
    Dernier message: 29/12/2005, 21h28
  4. Réponses: 17
    Dernier message: 24/03/2005, 12h24
  5. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42

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