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 :

copie de liste chainée


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 27
    Points : 25
    Points
    25
    Par défaut copie de liste chainée
    trouvé dans le livre de Delanoy, exercices en C++

    Je pense qu'en fait la liste est copiée à l'envers? pouvez-vous le confirmer ou l'infirmer?
    Merci d'avance

    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
    struct noeud
    {
    int valeur;
    noeud *suivant;
    };
     
     
    //creation d'une nouvelle liste identique à l'ancienne
    noeud*adsouce=Debut_Liste_initiale;
    noeud*adbut;
    debut=NULL;
    while(adsouce)
    {
    adbut=new noeud;                              //creation nouveau noeud
    adbut->valeur=adsouce->valeur;        //copie valeur
    adbut->suivant=debut;                       //insertion nouveau noeud
    debut=adbut;                                    //dans la liste
    adsouce=adsouce->suivant; 
    }

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Ca y ressemble bien.

    (T'es sûr que ce n'est pas un bouquin de C ?)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Il utilise new.

  4. #4
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    Citation Envoyé par Luc Hermitte
    Ca y ressemble bien.

    (T'es sûr que ce n'est pas un bouquin de C ?)
    avec un new j'en doute mais il est vrai que la pertinance du code est à revoir
    il y a du linge sur la corde à linge

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    C'est pour seul but d'exercice ? il existe deja dans la stl de quoi faire des list
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 63
    Points : 60
    Points
    60
    Par défaut
    Si tu veux la liste dans le bon ordre, il te suffira de faire un "reverse" de cette meme liste.
    Attention à l'implementer correctement, sinon tu risques de perdre un temps monstre à l'execution.
    Birds of a feather flock together

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 6
    Points
    6
    Par défaut c'est peut etre une façon ca...
    bon, j'ai pondu ça rapidement, je crois que ca marche (mais j'ai pas de compilo sous la main pour tester). Normalement ca fait une copie exacte de la chaine pointée par adSource, et la tête de la copie est accessible depuis adBut.

    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
     
    struct noeud
    {
    	int valeur;
    	noeud *suivant;
    };
     
    noeud *adSource = Debut_Liste_initiale;
    noeud *adBut;
    noeud *pNoeud; // sert à se balader sur la liste copiée sans perdre la tête :)
     
    // copie de la tête de la liste chainée.
    adBut = new noeud;
    adBut->valeur = adSource->valeur;
    adSource = adSource->suivant;
    pNoeud = adBut;
     
    while(adSource)
    {
    	pNoeud->suivant = new noeud;
    	pNoeud->suivant->valeur = adSource->valeur;
    	adSource = adSource->suivant;
    	pNoeud = pNoeud->suivant;
    }
     
    pNoeud->suivant = NULL;
    voila, j'espère que je n'ai pas fait de faute ^^'

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Salut,

    La liste est copiée à l'envers.
    Il s'agist ici d'une insertion en tete de liste.

    Explication

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    source->|9|-> |8|-> |7|-> |6|-> |5|-> |4|-> |3|-> |2|-> |1|-> |0|-> NULL
    dest->NULL
    le programme récupère le premier élément ici 9 et l'insère à la tete de la liste de dest ce qui donnera après la première itération:

    à la deuxième itération on récupère le 2e élément ici 8 on l'insère à la tete de la liste de dest ce qui donnera après la 2e itération:

    ....
    et à la fin


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dest->|0|-> |1|-> |2|-> |3|-> |4|-> |5|-> |6|-> |7|-> |8|-> |9|->NULL
    Si tu veux obtenire la liste dans le bon ordre il faut dans ce cas faire une insertion en queue de liste mais cela fait parcourir à chaque fois la lsite ce qui est couteux.

    Une alternative est d'utiliser une structure différente pour définir les liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct noeud 
    { 
    int valeur; 
    noeud *suivant; 
    }; 
     
    //definition d'une liste à double accès
    typedef struct _list{
     noeud *tete, *queue;
    }List, *pList;

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Pourquoi mélanger C et C++ (struct/pas struct) ?
    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
    struct list
    {
        list() : head_(0), tail_(0) {};
        list(list const & rhs) : head_(0), tail_(0) 
        {
            node * src = rhs.head_;
            if (src) 
            {
                tail_ = head_ = new node(src->value_);
     
                for (src=src->next_ ; src != 0 ; src=src->next_)
                {
                    tail_ -> next_ = new node(src->value_);
                    tail_ = tail_ -> next_;
                }
            }
        }
        list & operator=(list const & rhs)
        {
            list tmp(rhs);
            swap(tmp);
            return *this;
        }
        void swap(list & other)
        {
            std::swap(head_, other.head_);
            std::swap(tail_, other.tail_);
        }
     
        ... autres trucs publics ...
     
    private:
        struct node
        {
            node(T const & v, node * n=0) : value_(v), next_(n) {}
            node * next_;
            T value_;
        };
        node * head_;
        node * tail_;
    };

    PS: le préfixage par le tiret-bas est réservé aux personnes qui implémentent compilateurs et bibliothèques standards. Un tiret pour le C, deux pour le C++.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par Luc Hermitte
    PS: le préfixage par le tiret-bas est réservé aux personnes qui implémentent compilateurs et bibliothèques standards. Un tiret pour le C, deux pour le C++.
    une question: si on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct node 
    { 
            node(T const & v, node * n=0) : _value(v), _next(n) {} 
            node * _next; 
            T _value; 
    };
    est-ce vraiment génant ?
    il n'y a pas de risque de confusion avec les symboles créés par le compilo puisque _next et _value sont des membres de node.

    (C'est vrai que dans le doute, il vaut mieux éviter de le faire.)

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par jmv
    une question: si on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct node 
    { 
            node(T const & v, node * n=0) : _value(v), _next(n) {} 
            node * _next; 
            T _value; 
    };
    est-ce vraiment génant ?
    il n'y a pas de risque de confusion avec les symboles créés par le compilo puisque _next et _value sont des membres de node.
    Il y a toujours risque de confusion, à cause du préprocesseur, qui ne respecte en rien les règles de portées.

    En théorie, seules les noms commeçant par __ ou par _X avec X une lettre majuscule quelconque sont interdits tout le temps, et les noms commençant par _x avec x minuscule interdits au niveau du namespace global.

    En pratique, le plus simple est d'éviter tout ce qui commence par _, c'est aussi simple, et comme les compilos ne sont pas forcément réputés pour respecter cette règle...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  12. #12
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Le preprocesseur... je l'avais oublié celui-la , lol
    merci pour ta réponse

  13. #13
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par la drogue c'est mal
    Citation Envoyé par Luc Hermitte
    Ca y ressemble bien.

    (T'es sûr que ce n'est pas un bouquin de C ?)
    avec un new j'en doute mais il est vrai que la pertinance du code est à revoir
    Ce n'est pas la première fois qu'un livre de Delanoy est mis en cause ...
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  14. #14
    Nouveau membre du Club
    Inscrit en
    Mai 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 27
    Points : 25
    Points
    25
    Par défaut intérêt l'utilisation de struct?
    Merci à tous pour ces précieuses explications,


    ceci étant dit ça ne porte pas à conséquence dans le reste de l'exo
    à part le fait que je doutais sérieusement de ma compréhension!!

    Sinon, je me pose la même question que Lucpardon si j'ai pas compris)
    quel est l'intérêt d'utiliser un struct ici plutôt qu'une classe noeud? :

  15. #15
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    struct et class à un détail près (exploité dans mon exemple), c'est la même chose. Seule la visibilité par défaut change.

    Ma remarque concernait le mélange de styles.
    En C, on faisait des typedef pour se faciliter la vie avec les structures. En C++, ce n'est plus nécessaire -- dans du code limité aux compilateurs C++. En C on rapellait le struct pour définir des pointeurs sur le type que nous sommes en train de définir. (de même, cela ne se fait plus en C++).
    Or ici, on a eu un typedef et pas de rappel de struct dans la définition du noeud. Soit, un mélange de styles.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  16. #16
    Nouveau membre du Club
    Inscrit en
    Mai 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    bien bien à tous et à Luc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème constructeur par copie listes chainées
    Par Nicoclem dans le forum C++
    Réponses: 4
    Dernier message: 10/04/2008, 11h44
  2. Copie de liste hétérogène
    Par jbat dans le forum Langage
    Réponses: 6
    Dernier message: 03/07/2004, 11h01
  3. Copie de Liste
    Par Arnaud-h dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/05/2004, 14h46
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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