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 :

probleme liste chainee


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Par défaut probleme liste chainee
    salut a tous,

    Je souhaite ajouter une chaine de caractere dans data de la structure de ma liste chainee, mais quand jessaie de limprimer a l ecran il me met null donc je pense qu'il n'ajoute pas d'elements
    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
    t_listoperandes         *my_operandes_in_list(char *str)
    {
      t_listoperandes       *begin;
      int                   i;
      int                   l;
      int                   a;
      char                  *res;
     
      res = xmalloc(sizeof(*res));
      begin = xmalloc(sizeof(*begin));
      begin->data = 0;
      begin->next = 0;
      i = 0;
      l = 0;
      a = 0;
     
      while (str[i] != '\0')
        {
          if (str[i] > 47 && str[i] < 58)
            {
              res[a] = str[i];
              a++;
            }
          begin = add_to_list_operandes(res, begin);
          begin = begin->next;
          i++;
        }
      while (begin)
        {
          printf("%s", begin->data);
          begin = begin->next;
        }
    }

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    t_listoperandes         *add_to_list_operandes(char *data, t_listoperandes *begin)
    {
      t_listoperandes        *temp;
     
      temp = xmalloc(sizeof(*temp));
      temp->data = data;
      temp->next = begin;
      begin = temp;
     
      return (begin);
    }

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 55
    Par défaut
    ca a l'air bien crade ton code
    explique ce que tu fais la pour commencer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      while (str[i] != '\0')
        {
          if (str[i] > 47 && str[i] < 58)
            {
              res[a] = str[i];
              a++;
            }
          begin = add_to_list_operandes(res, begin);
          begin = begin->next;
          i++;
        }
    c pas plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      while (str[i] != '\0')
        {
          if (str[i] > 47 && str[i] < 58)
            {
              res[a] = str[i];
              a++;
            }
          i++;
         }
     
          begin = add_to_list_operandes(res, begin);
          begin = begin->next;

    ensuite ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    t_listoperandes         *add_to_list_operandes(char *data, t_listoperandes *begin)
    {
      t_listoperandes        *temp;
     
      temp = xmalloc(sizeof(*temp));
      temp->data = data;  // c pas plutot une copie que tu devrais faire ici
      temp->next = begin;
      begin = temp;
      return (begin);
    }

  4. #4
    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
    Salut,

    Je ne pense pas que tu peux utiliser ta variable res sous la forme d'un tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        while (str[i] != '\0')
        {
              if (str[i] > 47 && str[i] < 58)
                 {
                      res[a] = str[i];
                      a++;
                  }
                   /*...*/
    Si je ne trompe pas, res pointe sur un espace de 1 octet, non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      char                  *res;
     
      res = xmalloc(sizeof(*res));
    Je ne comprend pas bien ce que tu veux faire. Sinon, pour une utilisation propre de l'allocation dynamique, ce tutoriel est excellent:
    http://rperrot.developpez.com/articles/c/allocationC/
    "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++

    +

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Par défaut
    Ben son res peut être considéré comme un tableau car il alloue ici :

    res = xmalloc(sizeof(*res));

    Mais effectivement il serai bien de nous dire ce que fait ton code. et aussi, xmalloc ? késako ? pourquoi pas malloc ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Par défaut
    De plus si data dans ta structure est une chaine de caractère,

    temp->data = data;

    ne saurai pas fonctionner. Pour mettre une chaine de caractère dans une variable prévue à cet effet, il faut utiliser strcpy (ds string.h) :

    strcpy(temp->data,data);


    Voila

  7. #7
    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
    Oui, mais un tableau de 1 char. C'est pas beaucoup pour se permettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      while (str[i] != '\0')
        {
          if (str[i] > 47 && str[i] < 58)
            {
              res[a] = str[i];
              a++;
            }
    ....
    dès que a dépasse 0, ca plante
    deck_bsd
    De plus si data dans ta structure est une chaine de caractère,

    temp->data = data;

    ne saurai pas fonctionner.
    Ce qu'elle n'est pas, sinon il n'aurait pas pu écrire temp->data = data; le compilateur l'aurait interdit

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Par défaut
    en fait mon code est cense separe une expression par ex -456+789-456 dans deux listes chainees differentes avec les operateurs d'un cote et les nombres dans une autre liste chainee. Pour l'instant mon code pour mettre les operandes fonctionne mais pas pour mettre les chaines de caracteres des nombres. alors je sais pas si ca viens de ma structure ou jai declarer data en char *. voila la fonction pour les operandes
    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
    t_listoperandes         *my_operandes_in_list(char *str)
    {
      t_listoperandes       *begin;
      int                   i;
      int                   l;
      int                   a;
      char                  *res;
     
      res = xmalloc(sizeof(*res));
      begin = xmalloc(sizeof(*begin));
      begin->data = 0;
      begin->next = 0;
      i = 0;
      l = 0;
      a = 0;
     
      while (str[i] != '\0')
        {
          if (str[i] != 42 || str[i] != 43 || str[i] != 45 || str[i] != 47)
            {
              res[a] = str[i];
              a++;
              i++;
              res[a] = '\0';
            }
          if (str[i] == 42 || str[i] == 43 || str[i] == 45 || str[i] == 47)
            {
              begin = add_to_list_operandes(res, begin);
            }
          i++;
        }
      while (begin)
        {
          my_putstr(begin->data);
          begin = begin->next;
        }
     
    }
    puis la fonction qui ajoute a la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    t_listoperandes         *add_to_list_operandes(char *data, t_listoperandes *begin)
    {
      t_listoperandes        *temp;
     
      temp = xmalloc(sizeof(*temp));
      strcpy(temp->data,data);
      temp->next = begin;
      begin = temp;
     
      return (begin);
    }
    mais meme avec strcpy ca marche pas. je me mange un gros un seg fault a chaque fois. si quelqu'un a une idee...

  9. #9
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par Pitou5464
    mais meme avec strcpy ca marche pas. je me mange un gros un seg fault a chaque fois. si quelqu'un a une idee...
    strcpy ça n'alloue pas ta chaine, donc soit tu alloues ta data et tu strcpy soit tu strdup

    edit : j'ai mal lu, mais bon si tu utilises strdup, t évites de chopper un segfault pour un malloc trop petit

  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
    Il faudrait la définition de t_listoperandes pour savoir ce qu'est exactement le champ data. D'apres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      t_listoperandes       *begin;
    ....
      begin->data = 0;
    il semble que ce soit un pointeur. dans ce cas, il n'y a pas de place pour copier data, donc ceci plante (cf le post de Faiche):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    t_listoperandes        *temp; 
    temp = xmalloc(sizeof(*temp));
      strcpy(temp->data,data);
    Dans my_operandes_in_list
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      char                  *res;
      res = xmalloc(sizeof(*res));
    ne permet de placer qu'un seul caractère (cf mon post précédent). Il est même étrange que ca ne plante pas à ce niveau avec la boucle sur a
    De plus , les tests sont bizarres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (str[i] != 42 || str[i] != 43 || str[i] != 45 || str[i] != 47)
    si str[i] != 42 il répond true
    si str[i] == 42 donc différent de 43, il répond true
    -> il répond true toujours. Il s'agit probablement de && pas ||

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Par défaut
    dans t_listeoperandes, voila la structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct          s_listoperandes
    {
      char                          *data;
      struct s_listoperandes        *next;
    }                       t_listoperandes;

  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
    Alors, n'utilise pas strcpy qui suppose que la mémoire est allouée pour la chaîne de destination (ce qui n'est pas ton cas) mais strdup si tu en dispose. Sinon réalise l'allocation toi même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      temp = malloc(sizeof(*temp));
      if(temp) 
      {
       temp->data = malloc( strlen(data)+1);
       if(temp->data )
         {
           strcpy(temp->data,data);
    ....

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Par défaut
    je le place ou ce code dans quelle fonctiom?

  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
    je le place ou ce code dans quelle fonctiom?
    a la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    t_listoperandes  *add_to_list_operandes(char *data, t_listoperandes *begin)
    {
      t_listoperandes   *temp;
      temp = xmalloc(sizeof(*temp));
      strcpy(temp->data,data);
      .....
    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
    t_listoperandes  *add_to_list_operandes(char *data, t_listoperandes *begin)
    {
      t_listoperandes  *temp = malloc(sizeof(*temp));
      if(temp) 
      {
       temp->data = malloc( strlen(data)+1);
       if(temp->data )
         {
           strcpy(temp->data,data);// allocation obtenue : traitement normal
           ..... 
         }
       else
        {
          free(temp);// allocation impossible
          ..... 
         }
      }
      else.....// allocation impossible

Discussions similaires

  1. petit probleme liste chainees
    Par elmcherqui dans le forum C
    Réponses: 3
    Dernier message: 04/03/2008, 19h31
  2. Réponses: 1
    Dernier message: 12/02/2006, 17h55
  3. [FreePascal] Problème pour une simple liste chaînée
    Par piff62 dans le forum Free Pascal
    Réponses: 3
    Dernier message: 26/11/2005, 19h25
  4. Probleme avec les double Liste chainees
    Par BernardT dans le forum Langage
    Réponses: 1
    Dernier message: 12/07/2005, 17h22
  5. [LG]probleme d'ajout dans une liste chainée...
    Par misteryann dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2004, 20h28

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