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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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