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 :

Double pointeurs dans les listes chainées


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Double pointeurs dans les listes chainées
    Bonjour à tous !

    Dans les listes chaînées on utilise un double pointeur lorsque l'on souhaite modifier ce vers quoi pointe la tête de liste.

    En clair on place en paramètre de la fonction concernée : void fonction(Maillon ** tetedeliste) pour ensuite pouvoir utiliser *tetedeliste=.... ;

    Mais je ne vois pas pourquoi un simple pointeur ne suffit pas :
    void fonction(Maillon * tetedeliste) et tetedeliste=.... ;

    Tout ca n'est pas bien clair dans ma tête, qqn pourrait-il m'aider ?

    Je vous remercie !

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par NouK32 Voir le message
    Mais je ne vois pas pourquoi un simple pointeur ne suffit pas :
    void fonction(Maillon * tetedeliste) et tetedeliste=.... ;

    Tout ca n'est pas bien clair dans ma tête, qqn pourrait-il m'aider ?
    http://emmanuel-delahaye.developpez....difie_variable

  3. #3
    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 : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par NouK32 Voir le message
    Bonjour à tous !

    Dans les listes chaînées on utilise un double pointeur lorsque l'on souhaite modifier ce vers quoi pointe la tête de liste.

    En clair on place en paramètre de la fonction concernée : void fonction(Maillon ** tetedeliste) pour ensuite pouvoir utiliser *tetedeliste=.... ;

    Mais je ne vois pas pourquoi un simple pointeur ne suffit pas :
    void fonction(Maillon * tetedeliste) et tetedeliste=.... ;

    Tout ca n'est pas bien clair dans ma tête, qqn pourrait-il m'aider ?

    Je vous remercie !
    Simplement parce qu'en C, le passage d'arguments à une fonction se fait toujours par copie. Ainsi, si on a besoin de modifier l'adresse du premier élément de la liste depuis l'intérieur de la fonction, on a donc besoin d'un argument de type pointeur sur pointeur sur type du 1er élément.

    Il est toutefois possible de se simplifier la vie en utilisant une structure gestionnaire de liste (comme la structure Liste ci-dessous):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct Element {
        int data;
        struct Element *p_next;
    };
     
    struct Liste {
        struct Element *p_first;
        struct Element *p_last;
        size_t nelems;
    };
     
    int liste_ajouter(struct Liste *self, int data);
    Thierry

  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 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Simplement parce qu'en C, le passage d'arguments à une fonction se fait toujours par copie. Ainsi, si on a besoin de modifier l'adresse du premier élément de la liste depuis l'intérieur de la fonction, on a donc besoin d'un argument de type pointeur sur pointeur sur type du 1er élément.
    En d'autres termes, si ta fonction doit modifier un "truc" elle doit recevoir l'adresse de ce "truc". Et comme ici "truc" désigne un pointeur, elle doit recevoir l'adresse d'un pointeur.

    Citation Envoyé par Thierry Chappuis Voir le message
    Il est toutefois possible de se simplifier la vie en utilisant une structure gestionnaire de liste (comme la structure Liste ci-dessous):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct Element {
        int data;
        struct Element *p_next;
    };
     
    struct Liste {
        struct Element *p_first;
        struct Element *p_last;
        size_t nelems;
    };
     
    int liste_ajouter(struct Liste *self, int data);
    Thierry
    Exact. Rajouter une structure de manipulation de ta liste offre, en sus de la suppression du problème du double pointeur, la possibilité d'associer à ta liste des outils divers comme, ici, le nb d'éléments. Et une fonction qui reçoit un pointeur vers un "struct Liste" aura accès en lecture et en modifications à son p_first, son p_last et son nelems et, en partant de là, à toute la liste...

  5. #5
    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 : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Merci Sve@r pour les commentaires, je n'ai en effet pas trop eu le temps de détailler.

    Thierry

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Février 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bon je crois que j'ai compris, vous allez me dire si c'est le cas.
    En codant je n'ai jamais utilisé de double pointeurs pour les listes chainées et c'est pour cela que je comprenais pas.

    Je m'explique, moi ce que je faisais pour éviter le double pointeur c'est de retourner avec ma fonction la nouvelle valeur de la tetedeliste.
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Maillon * insereMaillon( Maillon * maillon, Maillon * tetedeliste)
    {
        tetedeliste=maillon;
        maillon->suivant=NULL;
     
        return tetedeliste;
    }
    Ensuite dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(void)
    {
        Maillon * tetedeliste;
        Maillon * maillon;
        tetedeliste=insereMaillon(maillon,tetedeliste);
        return 0;
    }
    Là c'est ok non ?

    Mais par contre si je veux modifier la tetedeliste directement dans ma fonction là il me faut un double pointeur.

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par NouK32 Voir le message
    Bon je crois que j'ai compris, vous allez me dire si c'est le cas.
    En codant je n'ai jamais utilisé de double pointeurs pour les listes chainées et c'est pour cela que je comprenais pas.
    Le terme de 'double pointeur' apporte plus de confusion qu'autre chose. La règle générale est que pour qu'une fonction f() puisse modifier la valeur de la variable v de type T, il faut passer l'adresse de cette variable, et donc utiliser un pointeur de type T :
    Le fait que type T soit 'pointeur sur XX' ne change rien à ce principe.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Soit un double pointeur, soit mettre le pointeur dans une structure et passer un pointeur vers cette structure.

    La seconde solution est plus simple et plus propre à mon gout: Elle sépare bien les structures "liste" et "chaînon".

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Soit un double pointeur, soit mettre le pointeur dans une structure et passer un pointeur vers cette structure.

    La seconde solution est plus simple et plus propre à mon gout: Elle sépare bien les structures "liste" et "chaînon".
    J'approuve, je le recommande et je le pratique :

    http://emmanuel-delahaye.developpez....s_chainees.htm

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/03/2014, 09h31
  2. les listes chainées
    Par najwWa dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2006, 19h09
  3. problème de pointeur avec les listes chainees
    Par innosang dans le forum C
    Réponses: 9
    Dernier message: 30/12/2005, 15h46
  4. Réponses: 7
    Dernier message: 22/10/2005, 19h20
  5. Réponses: 2
    Dernier message: 10/10/2005, 02h25

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