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 :

Liste chaînée inversée


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 169
    Points : 46
    Points
    46
    Par défaut Liste chaînée inversée
    Bonjour,

    Je débute en c++ et j'ai besoin d'un coud de main afin de résoudre cet exercice,

    /*
    L'objectif est de travailler avec une liste chaînée d'entiers positifs ou nuls.
    En un premier temps, le programme invoque la fonction saisir qui saisit
    les données à partir du clavier. Au fur et à mesure de l'insertion, les données
    sont insérées dans une liste chaînée de telle sorte que les données soient croissantes
    dans cette liste; on utilise pour cela la fonction inserer, qui utilise elle-même
    la fonction nouveau_maillon;.
    On affiche le contenu de la liste chaînée pour vérifier le résultat avec
    la fonction ecrire_liste.
    Ensuite, on renverse la liste chainée avec la fonction inverser : les données deviennent
    classées par ordre décroissant. Une contrainte est imposée à la fonction inverser :
    n'utiliser aucune création de struct maillon, c'est-à-dire aucun malloc.
    On vérifie le résultat avec la fonction ecrire_liste.
    Enfin, on libère l'espace-mémoire alloué à la liste chainée avec la fonction liberer.
    */


    merci d'avance pour votre aide

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Ici on ne donne pas de codes tout fait.. Tu bloques quelques part? (j'entends, à tu déjà fait un bout de code)?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 169
    Points : 46
    Points
    46
    Par défaut
    J'ai essayé avec celui-ci mais j'arrive pas à le debugger et j'ai l'impression que ca marche pas!!

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    #include <stdio.h>
    #include <stdlib.h>
     
    struct maillon
    {
     int valeur;
     struct maillon * suivant;
    };
     
    typedef struct maillon * VersMaillon ;
     
    VersMaillon construire(void);
    void ecrire(VersMaillon);
    VersMaillon renverser(VersMaillon);
     
    void main()
    {
     VersMaillon debut;
     
     debut=construire();
     printf("Voici la liste de vos entiers dans l'ordre de la liste chaînée construite : \n");
     ecrire(debut);
     debut=renverser(debut);
     printf("Voici la liste de vos entiers dans l'ordre de la liste chaînée renversée : \n");
     ecrire(debut);
    }
     
    VersMaillon construire()
    {
     VersMaillon deb, p;
     int donnee;
     
     
     deb=NULL;
     printf("Donnez vos données, tapez -1 pour terminer : \n");
     scanf("%d",&donnee);
     while (donnee!=-1)
       {
         p=(VersMaillon) malloc(sizeof(struct maillon));
         p->valeur=donnee;
         p->suivant=deb;
         deb=p;
         scanf("%d",&donnee);
       }
     return deb;
    }
     
    VersMaillon renverser(VersMaillon deb)
    {
     VersMaillon p, q ,r;
     
     if ((deb==NULL)||(deb->suivant==NULL)) return deb;
     q=deb->suivant;
     deb->suivant=NULL;
     r=q->suivant;
     q->suivant=deb;
     while (r!=NULL)
       {
         p=q;
         q=r;
         r=r->suivant;
         q->suivant=p;
       }
     deb=q;
     return deb;
    }
     
    void ecrire(VersMaillon deb)
    {
     VersMaillon p;
     
     p=deb;
     
     while (p!=NULL)
       {
         printf("%d ",p->valeur);
         p=p->suivant;
       }
     printf("\n");
    }

  4. #4
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Hum... ton code là écrit comme ça c'est du C.

    Pour la chaine en C++ on utiliserai deux class:

    une class maillon
    et une class liste qui gèrerai les maillons.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 169
    Points : 46
    Points
    46
    Par défaut
    ah ok!

    je suis entrain de faire un autre code! mais en execution ca n'aboutit pas à la bonne résultat!!!
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    #include <stdio.h>
    #include <stdlib.h>
     
    struct maillon
    {
     int donnee;
     struct maillon * suivant;
    };
     
    typedef struct maillon Maillon;
     
    /* Les prototypes des fonctions */
    Maillon * nouveau_maillon(int, struct maillon *);
    Maillon * inserer(Maillon * , int);
    Maillon * saisir(void);
    void ecrire_liste(Maillon *);
    Maillon * inverser(Maillon *);
    void liberer(Maillon *);
     
     
    int main(int argc, char ** argv)
    {
     Maillon * debut;
     
     debut = saisir();
     printf("liste croissante \n");
     ecrire_liste(debut);
     
     debut = inverser(debut);
     printf("liste decroissante \n");
     ecrire_liste(debut);
     
     liberer(debut);
     return 0;
    }
     
    /*
     Crée un nouveau maillon en mettant la valeur cle dans le champ donnee et
     la valeur deb dans le second champ.
    .*/
    Maillon * nouveau_maillon(int cle, struct maillon * deb)
    {
     
     Maillon * nouveau = (Maillon *) malloc(sizeof(Maillon));
     nouveau -> donnee = cle;
     nouveau -> suivant = deb;
     return nouveau;
    }
     
     
    /*
      Insère la valeur cle dans la liste triée par valeurs croissantes
      de début "debut" en respectant l'ordre.
      On insère la nouvelle valeur même si elle figurait déjà.
      Renvoie le début de la liste après insertion.
     
      On distingue d'abord le cas où la liste serait vide et le cas où cle serait
      inférieure à la première donnée de la liste.
      On cherche ensuite la place de cle en utilisant deux pointeurs p et q et en
      faisant en sorte que, au moment de l'insertion, p et q pointent sur deux maillons
      consécutifs, le premier maillon contenant une donnée < cle et le suivant une donnée > cle.
    */
    Maillon * inserer(Maillon * debut, int cle)
    {
     Maillon * p, * q;
     
     if ((debut == NULL) || (cle < debut -> donnee))
        debut = nouveau_maillon(cle, debut);
     else
       {
         p = debut;
         q = p -> suivant;
         while ((q != NULL) && (cle > q -> donnee))
           {
             p = q;
             q = q -> suivant;
           }
         p -> suivant = nouveau_maillon(cle, q);
       }
     return debut;
    }
     
    /*
     Demande à l'utilisateur les données et les insère au fur et à mesure
     dans la liste chaînée, de telle sorte que la liste soit triée.
     Utilise la fonction inserer.
     L'utilisateur indique la valeur -1 pour indiquer qu'il n'y a plus de données
    */
    Maillon * saisir()
    {
     
     Maillon * debut = NULL;
     int cle;
     
     printf("vos données, indiquez la fin avec la valeur -1 ? \n");
     scanf("%d", &cle);
     while (cle != -1)
       {
         debut = inserer(debut, cle);
         scanf("%d", &cle);
       }
     return debut;
    }
     
     
    /*
     Ecrit sur la sortie standard les données de la liste  chainée
     de début "debut" .
    */
    void ecrire_liste(Maillon * debut)
    {
     Maillon * p = debut;
     
     while (p != NULL)
       {
         printf("%d ", p -> donnee);
         p = p-> suivant;
       }
     printf("\n");
    }
     
    /*
     Prend un à un les maillons de la liste chainée de début "debut" pour
     construire une nouvelle liste chaînée qui est dans l'ordre inverse.
     Renvoie le début de la liste après inversion.
     La liste doit être inversée sans faire d'allocation dynamique (aucun malloc).
    */
    Maillon * inverser(Maillon * debut)
    {
     Maillon * debut_inverse = NULL, * p;
     
     while (debut != NULL)
       {
         p = debut;
         debut = debut -> suivant;
         p -> suivant = debut_inverse;
         debut_inverse = p;
       }
     return debut_inverse;
    }
     
    /*
     Libère la liste chaînée.
    */
    void liberer(Maillon * debut)
    {
     Maillon * p = debut;
     while (debut != NULL)
       {
         debut = debut -> suivant;
         free(p);
       }
    }

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    T'es sur de pas t'être trompé de section ? Parce que là si tu veux coder en C++ tu peux oublier tout les include de la librairie standart en .h
    tout comme les printf et autres scanf
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 169
    Points : 46
    Points
    46
    Par défaut
    Ok dsl mai je déffientie pas entre ça et ça!!
    qu'est ce que je dois faire donc pouyr ce bout de code!!

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Donc, tu veux du C, comme le reste du code?
    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.

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 169
    Points : 46
    Points
    46
    Par défaut
    non en fait je veux du c++

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Ben, t'es sûr que tu veux du C++, parce que rien que l'énoncé du problème fait penser à du C plutôt qu'à du C++...

    Pour répondre à ton problème :
    La seule chose que je vois de prime abord est la fonction libérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void liberer(Maillon * debut)
    {
     Maillon * p = debut;
     while (debut != NULL)
       {
         debut = debut -> suivant;
         free(p);
       }
    }
    Mais, rien qu'en relisant ces quelques lignes tu devrais te rendre rapidement compte pourquoi cela ne marche pas (un indice, que devient p?).

    Pour en revenir C vs C++ : d'abord, au lieu de fonctions, tu aurais probablement des méthodes dans une classe de liste, tu n'utiliserais pas de malloc/free mais des new/delete, tu n'as pas besoin de répéter struct maillon pour déclarer une variable, tu utilises des flux pour les lectures/écritures plutôt que scanf/printf, etc... Donc, es-tu vraiment sur de ton langage cible? Car si c'est C++, je n'ai qu'un conseil: recommence en C++ (pas en C compilé en C++) car rien du code que tu fournis n'est du C++ en soit.

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Ben, t'es sûr que tu veux du C++, parce que rien que l'énoncé du problème fait penser à du C plutôt qu'à du C++...

    Pour répondre à ton problème :
    La seule chose que je vois de prime abord est la fonction libérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void liberer(Maillon * debut)
    {
     Maillon * p = debut;
     while (debut != NULL)
       {
         debut = debut -> suivant;
         free(p);
       }
    }
    Mais, rien qu'en relisant ces quelques lignes tu devrais te rendre rapidement compte pourquoi cela ne marche pas (un indice, que devient p?).

    Pour en revenir C vs C++ : d'abord, au lieu de fonctions, tu aurais probablement des méthodes dans une classe de liste, tu n'utiliserais pas de malloc/free mais des new/delete, tu n'as pas besoin de répéter struct maillon pour déclarer une variable, tu utilises des flux pour les lectures/écritures plutôt que scanf/printf, etc... Donc, es-tu vraiment sur de ton langage cible? Car si c'est C++, je n'ai qu'un conseil: recommence en C++ (pas en C compilé en C++) car rien du code que tu fournis n'est du C++ en soit.
    +1000...

    en C++ réel (s'il ne s'agissait pas d'un excercice ) le code pourrait, pour les partie principales, se limiter à
    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
    #include <list>
    /* déclaration de la liste */
    std::list<unsigned int> liste;
    /* affichage dans l'ordre d'insertion */
    std::copy(liste.begin(), liste.end(), 
              std::ostream_iterator<A>(std::cout, " "));
    std::cout<<std::endl;
    /* affichage dans l'ordre inverse */
    std::copy(liste.rbegin(), liste.rend(), 
              std::ostream_iterator<A>(std::cout, " "));
    std::cout<<std::endl;
    /* suppression de tous les éléments */
    liste.clear();
    /* insertion d'un élément en fin de liste */
    liste.push_back(value);
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Inversion de liste chaînée
    Par timetheo dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2011, 01h20
  2. Inverser une liste chaînée
    Par fearyourself dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 16h41
  3. Inversion d'une liste chaînée
    Par sossomj dans le forum Pascal
    Réponses: 10
    Dernier message: 25/06/2006, 15h51
  4. Construction de liste chaînées
    Par fomblardo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 15/03/2005, 21h19
  5. Insertion d'un noeud dans une liste chaînée
    Par habib106 dans le forum Assembleur
    Réponses: 8
    Dernier message: 07/04/2004, 22h34

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