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 :

Ajouter un élément à une liste chainée


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Ajouter un élément à une liste chainée
    Bonjour,

    Je bloque sur un exercice (pourtant assez facile) d'ajout d'un élément à une liste chainée. Concrètement je dois faire passer le premier élément d'une liste A à une liste B.
    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
     
    t_push          *put_in_b(t_push **list_a, t_push **list_b)
    {
      t_push        *lptr;
     
      if ((lptr = malloc(sizeof(t_push))) == NULL)
        return (NULL);
      if (lptr != NULL)
        {
          lptr->data = (*list_a)->data;
          lptr->prev = NULL;
          if ((*list_b)->tail == NULL)
            {
              lptr->next = NULL;
              (*list_b)->head = lptr;
              (*list_b)->tail = lptr;
            }
          else
            {
              (*list_b)->head->prev = lptr;
              lptr->next = (*list_b)->head;
              (*list_b)->head = lptr;
            }
          (*list_b)->data = lptr->data;
          (*list_b)->len++;
        }
      decal(list_a);
    }
    la fonction decal(t_push **list_a) fonctionne sans problème (elle supprime l'élément de la liste A passé dans la liste B).
    Mon souci est que ma fonction put_in_b, plutôt que de stocker les éléments mis dans la liste B au fur et à mesure, remplace à chaque fois le premier élément ce qui fait que ce genre d'appel :
    list_a : 3 5 4 6
    list_b :
    put_in_b(&list_a, &list_b);
    put_in_b(&list_a, &list_b);
    put_in_b(&list_a, &list_b);

    me donne : my_show_list(list_b) = 4 alors que je veux : my_show_list(list_b) = 4 5 3

    Je ne sais pas si je suis très claire,
    merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Sur le papier, ton algo me semble bon. On peut avoir le source complet pour tester ???
    Sinon 2 remarques
    1. t'as pas besoin de retester si lptr != NULL
    2. il semblerait que ton t_push (qui possède un élément "head", "len" et "tail") soit un type dédié à gérer la liste elle-même, et qui possède un élément "data", "prev" et "next", soit aussi un type dédié à gérer un noeud. C'est pas bon. Déjà tous les noeuds auront un "len", "first" et"tail" mais un seul d'entre eux aura ces éléments corrects et il est probable que la confusion vienne de ça. Tu peux pas créer un type dédié à la liste, et un autre dédié au noeud ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Je plussoie les remarques de Sve@r, tu devrais avoir une structure Liste et une autre Noeud, dans le genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Noeud {
      int val; // ou tout autre type d'élément
      struct Noeud *prev, *next;
    };
     
    struct Liste {
      size_t len;
      struct Noeud *head, *tail;
    };
    Ensuite fais des fonctions basiques, genre push et pop:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct Node* pop(struct Liste **l) {
      struct Node* n = (*l)->head;
      /* faire les différentes opérations pour que (*l)->head devienne (*l->head->next) */
      return n;
    }
     
    void push(struct Liste** a, struct Node* n) { /* modifier a->head, n->next, n->next->prev */ }
    de même pour push et ensuite tu peux écrire (sans qu'il soit besoin d'allouer ou de libérer de la mémoire, cela soit dit en passant):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void pushtoB (struct Liste** a, struct Liste** b) {
      push(b, pop(a));
    }

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par stendhal666 Voir le message
    Je plussoie les remarques de Sve@r, tu devrais avoir une structure Liste et une autre Noeud, dans le genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Noeud {
      int val; // ou tout autre type d'élément
      struct Noeud *prev, *next;
    };
     
    struct Liste {
      size_t len;
      struct Noeud *head, *tail;
    };
    Perso je préfère nommer les structures "s_xxx" mais c'est pas mal.

    Citation Envoyé par stendhal666 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct Node* pop(struct Liste **l) {
      struct Node* n = (*l)->head;
      /* faire les différentes opérations pour que (*l)->head devienne (*l->head->next) */
      return n;
    }
    Pas besoin de double pointeur (ce qui t'évitera les erreurs (*l->head->next) au lieu de (*l)->head->next)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct Node* pop(struct Liste *l) {
      struct Node* n = l->head;
      /* faire les différentes opérations pour que l->head devienne l->head->next */
      return n;
    }
    Et pareil pour le push.

    Citation Envoyé par stendhal666 Voir le message
    de même pour push et ensuite tu peux écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void pushtoB (struct Liste** a, struct Liste** b) {
      push(b, pop(a));
    }
    Yeah classe !!! (mais avec une seule étoile ça le fait aussi

    Sauf que peut-être on peut revenir au standard et mettre en premier la liste destinatrice (comme c'est le cas dans strcpy et autres)...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void pushToOtherList (struct Liste* dest, struct Liste* src) {
      push(dest, pop(src));
    }
    Mais tu gardes ton

    Citation Envoyé par stendhal666 Voir le message
    (sans qu'il soit besoin d'allouer ou de libérer de la mémoire, cela soit dit en passant):
    Exact parce que heureusement tu ne fais pas de free()
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Dacodac, merci tout le monde pour votre aide ! J'ai finalement trouvé de mon côté une méthode un peu plus optimisée pour contourner le problème et je viens de voir où était mon soucis,
    Merci

Discussions similaires

  1. Ajouter plusieurs éléments à une List
    Par Rifton007 dans le forum VB.NET
    Réponses: 5
    Dernier message: 22/11/2011, 19h25
  2. Ajouter des éléments à une liste
    Par hassen07 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/05/2010, 18h42
  3. Ajouter un élément à une liste
    Par izulah dans le forum Prolog
    Réponses: 5
    Dernier message: 17/03/2009, 08h57
  4. Ajouter un élément à une "List" - à l'aide!
    Par WinNew dans le forum Flex
    Réponses: 2
    Dernier message: 23/01/2009, 13h20
  5. Ajouter un élément à une liste
    Par circe dans le forum R
    Réponses: 2
    Dernier message: 24/10/2008, 18h00

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