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 :

aide pour listes chainées


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Par défaut aide pour listes chainées
    salut
    j'essai de comprendre la liste chainé
    je voudrais une aide mes questions sont poser a même le 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include <stdlib.h>
     
    typedef struct element element;
    struct element
    {
        int val;
        struct element *nxt;/* le struct me pose probleme pourquoi ne pas écrire simpmlement element *nxt  */
    };
     
    typedef element* llist;/*un nouveau type *llist qui est un pointeur a partir de typedef element, pouvez-vous me démontré comment? car pour moi on a n'a pas créer  une structure  comme pour le type  element  */
     
    
    int main(int argc, char **argv)
    {
        /* Déclarons 3 listes chaînées de façons différentes mais              équivalentes */
        llist ma_liste1 = NULL;
        element *ma_liste2 = NULL;
        struct element *ma_liste3 = NULL;
     
     
        return 0;
    }
    
    llist ajouterEnTete(llist liste, int valeur)/*liste en fait c'est ma_liste?*/
    {
        /* On crée un nouvel élément */
        element* nouvelElement = malloc(sizeof(element));
     
        /* On assigne la valeur au nouvel élément */
        nouvelElement->val = valeur;
     
        /* On assigne l'adresse de l'élément suivant au nouvel élément */
        nouvelElement->nxt = liste;/*ici les variables ne sont pas du meme type ? */
     
        /* On retourne la nouvelle liste, i.e. le pointeur sur le premier élément */
        return nouvelElement;/*/*qu'est ce que i.e.?*/*/
     
    }
    [/CODE]

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Salut,

    rajoute [/CODE] a la fin de ton message s'il te plait.

    typedef struct element element;
    struct element
    {
    int val;
    struct element *nxt;/* le struct me pose probleme pourquoi ne pas écrire simpmlement element *nxt */
    };
    Etant donné que tu as mis un typedef avant, cela devrait passer si tu met simplement element *nxt;

    typedef element* llist;/*un nouveau type *llist qui est un pointeur a partir de typedef element, pouvez-vous me démontré comment? car pour moi on a n'a pas créer une structure comme pour le type element */

    Ow, y'a confusion.
    Un typedef n'est pas exclusivement reservé au structure. Un typedef te permet d'ecrire un alias (ou une autre ecriture) pour nommer autre chose.
    Dans ce cas ci,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    element* Premier,
    llist Deuxime;
    Aura pour effet que Premier et Deuxieme auront le meme type !
    Si on utilise le typedef avec les structure, c'est pour eviter de re-ecrire 'struct' a chaque fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    llist ajouterEnTete(llist liste, int valeur)/*liste en fait c'est ma_liste?*/
    Le nom d'une variable dans l'entete de la fonction n'a rien a voir avec le nom de la variable dans l'appelant.
    Ici, ajouterEnTete attend comme premier parametre une variable de type llist.
    ma_liste pourrait tout a fait convenir (d'ailleurs, c'est normalement celle-la que tu passera).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nouvelElement->nxt = liste;/*ici les variables ne sont pas du meme type ? */
    si on reprend :

    type de nouvelElement->nxt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct element element;
    struct element
    {
    int val;
    struct element *nxt;
    };
    type de liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    llist ajouterEnTete(llist liste, int valeur)
    A priori, on pourrait penser que ce n'est pas le meme type.
    Or, tu as fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef element* llist;
    Donc, ces deux variable sont bien de meme type, a savoir 'element*'


    Pour i.e, je ne sais plus exactement : je pense que ca veut dire 'In exemple' -> 'Par exemple'

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    1. Le struct me pose problème: pourquoi ne pas écrire simplement element *nxt?
      Oui, on peut écrire simplement element *nxt, du moment que le typedef est défini avant la structure.
      .
    2. Un nouveau type *llist qui est un pointeur a partir de typedef element, pouvez-vous me démontrer comment? Car pour moi on a n'a pas créé une structure comme pour le type element
      On a le type struct element
      On a le typedef element qui représente le type struct element
      Et on a le typedef llist qui représente le type element* (étoile comprise), donc en vérité le type struct element*.
      .
    3. liste en fait c'est ma_liste?
      liste représente le paramètre passé à ajouterEnTete() lors de l'appel. Vu que ajouterEnTete() n'est jamais appelée, ce paramètre ne possède jamais de valeur...
      .
    4. Ici les variables ne sont pas du même type ?
      Si, les deux variables sont de types struct element*. Simplement, l'une utilise ce type via un alias.
      .
    5. Qu'est ce que "i.e."?
      i. e. sur Wikipédia
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    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
    llist ajouterEnTete(llist liste, int valeur)
    {
        /* On crée un nouvel élément OK*/
        element* nouvelElement = malloc(sizeof(element));
     
        /* On assigne la valeur au nouvel élémentok */
        nouvelElement->val = valeur;
     
        /* On assigne l'adresse de l'élément suivant au nouvel élément je comprend pas*/
        nouvelElement->nxt = liste;/*ici la variable liste qui est ma_liste1 n'a pas d'adresse cette  variable pointe sur null ? llist ma_liste1 = NULL; ou element *ma_liste1=NULL*/
    
     
        /* On retourne la nouvelle liste, i.e. le pointeur sur le premier élément */
        return nouvelElement;
    }

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Je ne comprend pas ta question.

    Ta liste chainé est, normalemnt, une liste simplement chainé non circulaire. Afin de marquer la fin d'une liste, le dernier maillon doit avoir le pointeur nxt a NULL.

    Si ta liste est vide, alors ma_list == NULL.

    Lorsque tu fais appel a ta fonction : elle se charge de remplir convenablement la nouvelle structure, puis elle le met en début de chaine. Cela se caractérise par le fait que le pointeur de debut de chaine est mis a nxt du nouvel element.

    Tu retourne donc un pointeur sur le debut de la liste qui est la nouvelle structure.

    Donc, il est tout a fait logique que ma_liste puisse valoir NULL.

    Cependant, pour ne pas perdre la chaine, tu dois appeler la fonction comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ma_liste = ajouterEnTete(ma_liste, valeur);

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Par défaut
    ma_liste = ajouterEnTete(ma_liste, valeur);
    quand on appelle cette fonction on créer une nouvelle variable de type element
    qui a récupéré une valeur par la fonction qui est lier a la variable ma_liste
    ex si j'envoie la valeur 5 nouvelElement->val=5 et ma_list->val= ? ?

    une liste chainer sont des variables du meme type avec la meme structure qui peuvent avoir des valeurs diffèrent la dernier variable n'a pas d'adresse

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Citation Envoyé par fil de fer Voir le message
    ma_list->val = ajouterEnTete(ma_liste, valeur);
    Mauvaise recopie, non? Ici, les deux côtés du = ne sont pas du même type... (int contre llist).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. aide sur liste chainé
    Par hamma2009 dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2010, 12h05
  2. Réponses: 4
    Dernier message: 30/10/2009, 11h45
  3. [MySQL] Besoin d'aide pour liste déroulante dreamweaver + mysql
    Par dreamover dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/03/2009, 15h56
  4. Aide pour liste déroulante
    Par csseur22 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 28/11/2008, 11h21
  5. Aide pour listes déroulantes liées
    Par Raiga dans le forum VBA Access
    Réponses: 2
    Dernier message: 09/07/2007, 14h34

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