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

  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;
    }

  7. #7
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut
    J'ai essaye ce que tu m'as dit.

    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
     
    # include <stdio.h>
    # include <stdlib.h>
    # include <string.h>
     
    struct record * MakeList ( void ); 
    struct record * MakeNode ( void );
    void LoadNode ( struct record * locn, char str [] );
    void Queue ( struct record * x );
     
     
    struct record  {
      char command [ 11 ];  
      char word [ 11 ]; 
      struct record * next;
      };
     
    int main ( void )
    {
      struct record * start;        
      start = MakeList ( );          
      Queue ( start );        
      return 0;
    }
     
    struct record *find(struct record *info, char *word ) {
           // faut il initialiser qqchose ici ?
            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,
                    * current,
                    * new;
      char buffer [ 81 ];
     
      printf(" Enter script file : ");
      gets(fname);
     
      if ( ( sf = fopen ( fname, "r" ) ) == NULL ) {
        printf ( "MAKELIST: Unable to open input file %s!\n", fname );
        exit ( 1 );
        }
     
      fgets ( buffer, 81, sf );
      while ( ! feof ( sf ) ) {
        new = MakeNode ();
        if ( start == NULL )
          start = current = new;
        else {
          current->next = new;
          current = current->next;
          }
        LoadNode ( current, buffer );
        fgets ( buffer, 81, sf );
        }
      fclose ( sf );
      return start;
    }
     
    void LoadNode ( struct record * locn, char str [] )
    { char s[40];
      struct record * start;
     
      sscanf ( str, "%s %s", locn->command, locn->word );
     
       if(strcmp(locn->command,"delete") == 0 ) {
         printf("==%s %s==\n",locn->command, locn->word);
         strcpy(s,locn->word);
     
         find(start, s);  // j'appelle find avec la list a chercher, et le mot a chercher
          }
      return ;
    }
     
     
    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;
     
       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;
    }
    Ouput
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ==delete Wilson==  // pour tester 
     
    Cannot find item to delete. // toujours le message d'erreur
    Wilson
    Jones
    Smith
    Wilson
    si le fichier d'entree est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    add Wilson
    add Jones
    add Smith
    add Wilson
    delete Wilson
    queue
    pause

  8. #8
    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
    7
    8
    void LoadNode ( struct record * locn, char str [] )
    { char s[40];
      struct record * start;
    ....
          find(start, s);  // j'appelle find avec la list a chercher, et le mot a chercher
          }
      return ;
    }
    start n'est pas initialisé au moment de l'appel de find !!!
    Pour tester find, appelle la dans le main avec pour argument la tête de liste. Dans main, la tête de liste est start (initialisée par MakeList )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main ( void )
    {
      struct record * start;        
      start = MakeList ( );
      find (start,....);          
      Queue ( start );        
      return 0;
    }

  9. #9
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut
    Maintenant ca marche, mais seulement quand find est appelle a l'interieur de main (), mais moi je voudrais l'appeller a l'interieur de MakeList (). Comment faire dans ce cas puisque start dans makelist() est initialise a NULL ?

    Pourquoi ne pas declarer start en tant que variable globale ? Parce qu'en principe sa valeure ne va pas changer...

  10. #10
    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
    Maintenant ca marche, mais seulement quand find est appelle a l'interieur de main (), mais moi je voudrais l'appeller a l'interieur de MakeList (). Comment faire dans ce cas puisque start dans makelist() est initialise a NULL ?
    Tu peux appeler find à partir de MakeList, puisque dans MakeList on connait la tête de liste (qui est la variable locale start).
    Pourquoi ne pas declarer start en tant que variable globale ?...
    Les variables globales obscurcissent le code,et ne le simplifient pas contrairement à ce qu'on peut penser a priori : En effet, les fonctions utilisant les variables globales ne sont pas autonomes dans leur fonctionnement puisqu'elles dépendent d'éléments extérieurs à la fonction dont la valeur a peut être été mise par une ou plusieurs autres fonctions (et dans ce cas, lesquelles, et quelle valeur a la globale). Si une fonction dépend d'une valeur pour son fonctionnement, celle-ci doit être passée en paramètre à la fonction
    Les globales nuisent à la clarté du code, même simple, et sont des problèmes dès que le programme devient un peu important. Elles sont à exclure et c'est une attitude saine à prendre le plus tôt possible.

  11. #11
    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
    Tu peux appeler find à partir de MakeList, puisque dans MakeList on connait la tête de liste (qui est la variable locale start).
    J'ai essaye plusieurs fois d'appeller find dans Makelist(), mais le probleme c'est la fonction find trouve toujours un mot meme si il n'existe pas !

    example:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct record *find(struct record *info, char *word ) {
            printf("<%s>\n", word); /* mot a supprimer */
            while(info) {
                    if(!strcmp(word, info->word)){
                        puts("the word is found.\n"); /* message pour voir si le a été trouvé */
                        return info;
                        }
                    info = info->next;
                    }
            fprintf(stderr, "\n\tCould not find word to delete.\n");
            return NULL;
    }
    Quand j'appelle find dans Makelist, quoique la variable word contient, j'ai toujours le message "the word is found".

    Par contre, quand find est appellée dans main() ca marche correctement.

    Je sais pas quelle est le probleme.

  12. #12
    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
    Quand j'appelle find dans Makelist, quoique la variable word contient, j'ai toujours le message "the word is found".
    Par contre, quand find est appellée dans main() ca marche correctement
    Montre le code de MakeList qui appelle find.

  13. #13
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut
    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
    struct record * MakeList ( void )
    {
       struct record * start = NULL;
       struct record * current,
                     * new;
      FILE * sf;
      char fname[31];
      char buffer [ 81 ];
     
      printf(" Enter script file : ");
      gets(fname);
     
      if ( ( sf = fopen ( fname, "r" ) ) == NULL ) {
        fprintf (stderr, "Unable to open script file %s!\n", fname );
        exit ( 1 );
        }
     
      fgets ( buffer, 81, sf );
      while ( ! feof ( sf ) ) {
        new = MakeNode ();
        if ( start == NULL )
          start = current = new;
        else {
          current->next = new;
          current = current->next;
          }
    /*************** Load Node **************/
       char s[40];
       sscanf ( buffer, "%s %s", current->command, current->word );
     
       if(strcmp(current->command,"delete") == 0 ) {
         printf("==%s %s==\n", current->command, current->word);
         strcpy(s, current->word);
         find(current, s);   /* ICI meme si je met start a la place de current, meme probleme */
         }
    /****************************************/
        fgets ( buffer, 81, sf );
        }
     
      fclose ( sf );
    return start;
    }

  14. #14
    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
    7
    8
       char s[40];
       sscanf ( buffer, "%s %s", current->command, current->word );
     
       if(strcmp(current->command,"delete") == 0 ) {
         printf("==%s %s==\n", current->command, current->word);
         strcpy(s, current->word);
         find(current, s);   /* ICI meme si je met start a la place de current, meme probleme */
         }
    Evidemment qu'il trouve toujours puisque tu viens de mettre le mot (current->word) dans la liste !! Il est même toujours dans current. Il faut que tu revoies la conception de MakeList . Lorsqu'il y a delete, dans ce cas, il ne faut PAS mettre le mot dans la liste mais chercher si il y est déjà ( find(start,...) ) pour l'enlever

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