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 :

Insertion dans une liste chainée


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 1
    Points : 3
    Points
    3
    Par défaut Insertion dans une liste chainée
    Bonjour,
    voila j'ai un petit problème : je dois insérer un élément dans une liste chaînée pour cela j'ai crée une méthode " inserer() ", cette méthode insère et tout mais le problème c'est qu'elle insère dans une copie de ma liste, problème de passage par référence/valeur je pense mais pourtant ma liste est un pointeur normalement ça doit passer par référence je ne comprend pas si vous pouvez m'aider ça sera sympa et merci beaucoup.

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    // structure du noeud
    typedef struct  Noeud
    {
           int val;
           struct Noeud * suiv;
    }Noeud;
     
    //Une Liste contient un enssemble de noeud
    typedef Noeud* Liste;
     
    //les methode qui seront utilisé pour gérer la liste
    void afficher(Liste);
    int inserer(Liste ,int);
     
     
    int main()
    {
        Liste l = NULL;
        inserer(l,21);
        inserer(l,22);
        inserer(l,23);
        afficher(l);
    }
     
     
    int inserer(Liste l,int a)
    {
     
        Noeud* nouv = (Noeud*) malloc(sizeof(struct Noeud));
        nouv->val=a;
        nouv->suiv=l;
        l=nouv;
     
     
    }
    void afficher(Liste l)
    {
        Noeud * parcours=l;
         while(parcours)
         {
            printf("\n- %d",parcours->val);
            parcours=parcours->suiv;
         }
     
    }

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Utilise la balise code signalée par le croisillon pour poster du code

    Référence (ou alias) n'existe pas en C . Mais en C++, il faut utiliser l'esperluette Liste& l.

    En C, l'esperluette sert à récupérer une adresse d'une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        int i = 9;
        int* p_i = &i;

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par foetus Voir le message
    En C, l'esperluette sert à récupérer une adresse d'une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        int i = 9;
        int* p_i = &i;
    En C++ aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int & foo = i;// référence
    &foo; // adresse

  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 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par liraquikhalil Voir le message
    Bonjour,
    voila j'ai un petit problème : je dois insérer un élément dans une liste chaînée pour cela j'ai crée une méthode " inserer() ", cette méthode insère et tout mais le problème c'est qu'elle insère dans une copie de ma liste, problème de passage par référence/valeur je pense mais pourtant ma liste est un pointeur normalement ça doit passer par référence je ne comprend pas si vous pouvez m'aider ça sera sympa et merci beaucoup.
    Code c : 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
    int main()
    {
        Liste l = NULL;
        inserer(l,21);
        inserer(l,22);
        inserer(l,23);
        afficher(l);
    }
     
    int inserer(Liste l,int a)
    {
        Noeud* nouv = (Noeud*) malloc(sizeof(struct Noeud));
        nouv->val=a;
        nouv->suiv=l;
        l=nouv;
    }
    Bonjour

    Dans ton raisonnement tu n'as oublié qu'une seule chose (la plus importante): si ta fonction "inserer()" modifie la liste (qui, comme tu le dis est un pointeur), alors elle ne peut le faire que si elle reçoit l'adresse de ce pointeur. Hé oui, même pour les pointeurs la règle reste la même: une fonction qui veut modifier un élément reçu doit recevoir l'adresse de cet élément.

    Normalement (désolé suis dans un aéroport en attendant mon vol j'ai pas le temps de tester) ceci devrait fonctionner

    Code c : 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
    int main()
    {
        Liste l = NULL;
        inserer(&l,21);
        inserer(&l,22);
        inserer(&l,23);
        afficher(l);
    }
     
    int inserer(Liste *l,int a)
    {
     
        Noeud* nouv = (Noeud*) malloc(sizeof(struct Noeud));
        nouv->val=a;
        nouv->suiv=(*l);
        (*l)=nouv;
    }

    Ce détail est anodin mais il va avoir quand-même des conséquences importante (j'espère) sur ta façon de coder. En effet, tu remarqueras que masquer l'étoile de "Noeud*" derrière un nouveau type "Liste" ne te fait rien gagner vu que t'es quand-même obligé d'utiliser un pointeur "Liste *" dans ta fonction "inserer()". Ca peut même être négatif dans la mesure où un développeur C a besoin de savoir ce qu'il manipule. Or toi tu caches le pointeur. Et au lieu de simplifier ton code ça le rend plus complexe à décrypter pour les autres (n'oublie pas qu'un code est 100 fois plus lu qu'écrit).
    Donc arrête d'avoir peur des pointeurs et apprend à les manipuler.

    Surtout que t'es pas obligé d'utiliser un "Noeud **" si ça devient trop diffiicle. Tu peux très bien créer un vrait type "Liste" qui encpasulera le noeud dans une structure dédiée. Te suffira alors de passer l'adresse de cette structure (un pointeur à une étoile) à ta fonction "inserer()". Et en plus c'est tout bénef si, ensuite, tu veux rajouter des éléments de gestion à ta liste (comme par exemple nombre d'éléments, adresse du dernier, etc). Tu le rajoutes dans la structure et toutes tes fonctions y auront immédiatement accès sans modif dans ta façon de leur passer des paramètres. Comme je dis souvent, on peut tenir une chemise par le col mais c'est mieux si on la met sur un cintre.

    Dernier détail: nomme tes structures "s_xxx" et tes types "t_xxx" ça rendra ton code plus clair.

    Donc exemple de ce que tu pourrais faire
    Code c : 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
    // structure du noeud
    typedef struct s_noeud
    {
           int val;
           struct s_noeud * suiv;
    } t_noeud;
     
    //Une Liste contient un enssemble de noeud
    typedef struct {
        t_noeud *first;
    } t_liste;
     
    //les methode qui seront utilisé pour gérer la liste
    void init(t_liste*)
    void afficher(t_liste*);
    int inserer(t_liste* ,int);
     
    int main()
    {
        t_liste l;
        init(&l);
        inserer(&l,21);
        inserer(&l,22);
        inserer(&l,23);
        afficher(&l);
    }
     
    void init(t_liste *l)
    {
        l->first=NULL;
    }
     
    int inserer(t_liste *l, int a)
    {
        t_noeud* nouv = malloc(sizeof(t_noeud));      // On ne caste pas un malloc
        nouv->val=a;
        nouv->suiv=l->first;
        l->first=nouv;
    }
     
    void afficher(t_liste *l)
    {
         t_noeud *parcours=l->first;
         for (parcours=l->first; parcours != NULL; parcours=parcours->suiv)
            printf("\n- %d", parcours->val);
    }

    Absolument pas plus compliqué que ton premier code mais tellement plus évolutif...
    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]

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/01/2014, 01h07
  2. Réponses: 7
    Dernier message: 21/11/2012, 12h40
  3. Réponses: 2
    Dernier message: 21/05/2012, 07h36
  4. Insertion rapide dans une liste chainée
    Par Invité dans le forum C
    Réponses: 7
    Dernier message: 11/02/2012, 11h42

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