Partage
  • Partager sur Facebook
  • Partager sur Twitter

Listes linaires, un problème

Qu'est ce qui cloche?

Sujet résolu
    6 décembre 2007 à 18:23:56

    Salut!
    voila, je suis en train de coder un biblio pour les liste, piles, files, arbres et graphs, mais sur les liste simples, il y'a un problème, voila le code:
    1. #include<stdio.h>
    2. using namespace std;
    3. struct element
    4. {
    5.  int data;
    6.  element* nxt;
    7. };
    8. void addHead(element* liste, int val)
    9. {
    10.     element* ele = new element;
    11.     ele->data=val;
    12.     ele->nxt=liste;
    13.     liste=ele;
    14. }
    15. void printl(element* liste)
    16. {
    17.     element* ptr = liste;
    18.     cout<<ptr<<endl;
    19.     while(ptr!=NULL)
    20.     {
    21.         cout<<ptr->data;
    22.         ptr=ptr->nxt;
    23.     }
    24. }
    25. int main()
    26. {
    27.     element* liste=NULL;
    28.     for(int i=0;  i<10; i++)
    29.     {
    30.         addHead(liste,i);
    31.     }
    32.     printl(liste);
    33.     return 0;
    34. }


    Bon, ce qui se passe, c'est que rien ne saffiche après l'appel à la fonction printl, et j'ai ajouté la ligne
    1. cout<<ptr<<endl;

    pour verifier l'adresse contenue par ptr après lui avoir affecté liste, et elle contient 0!, alors que je lui ai affécté l'adresse de ele!
    Merci de bien vouloir eclairer ce point sombre qui me tracasse depuis deux jours!
    merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter

    La maîtrise des fondamentaux est le fondamental de la Maîtrise.

      6 décembre 2007 à 18:58:52

      Bonsoir !

      Pour modifier l'adresse de la liste a l'interieur de ta fonction addHead, tu dois passer en parametre l'adresse du pointeur de tete de liste (comme tu le ferais avec une variable classique).
      Dans ta fonction tu ne fais que modifier le pointeur "local" de la tete de liste !
      • Partager sur Facebook
      • Partager sur Twitter
      Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
        6 décembre 2007 à 19:02:55

        Ok, ça marche, merci beaucoup.
        • Partager sur Facebook
        • Partager sur Twitter

        La maîtrise des fondamentaux est le fondamental de la Maîtrise.

          6 décembre 2007 à 19:11:02

          a noté qu'en C++ on utilise 0 au lieu de NULL
          • Partager sur Facebook
          • Partager sur Twitter
            6 décembre 2007 à 19:12:17

            Quelle différence ?

            Il y a un #define null 0 qui traîne dans un header.
            • Partager sur Facebook
            • Partager sur Twitter
            Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
              6 décembre 2007 à 19:14:38

              il me semble que c'est
              #define NULL (void*)0
              mais je n'ai jamais verifié
              • Partager sur Facebook
              • Partager sur Twitter
                6 décembre 2007 à 19:26:54

                ce n'est pas bien brave, NULL ou 0, du fait que c'est pareil!
                • Partager sur Facebook
                • Partager sur Twitter

                La maîtrise des fondamentaux est le fondamental de la Maîtrise.

                  6 décembre 2007 à 19:39:23

                  http://h-deb.clg.qc.ca/ -> Questions de C++ -> Comprendre la petite histoire de NULL (devenu simplement 0) en C++.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 décembre 2007 à 20:14:19

                    Il y a des trucs qui sont importants. 0 vs NULL ne l'est pas.

                    Il y a une famille de gurus qui milite pour 0, une autre famille (de vrais gurus toujours) qui milite pour un truc sémantiquement plus explicite (NULL).

                    Finalement, on aura (C++0x) un nullptr (ou nilptr, je ne sais plus).
                    • Partager sur Facebook
                    • Partager sur Twitter
                    C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                      6 décembre 2007 à 22:20:22

                      C'est beau fissal_houate mais c'est une implémentation très C d'une file que tu nous a montrer...

                      Ce n'est pas tout les compilateurs qui initialise les pointeurs à 0 alors le pointeur nxt ne vaut pas nécessairement 0 alors tu risque la boucle infinie.

                      Pour ce qui est du NULL, c'est un question qui revient à tout les topics oû il n'y a que l'ombre d'un pointeur : moi je suis pour le 0 parce que je trouve que c'est tout simplement propre et que ça ne cache rien derrière un vieux #define.

                      en C++ NULL vaut 0
                      en C NULL vaut (void*)0

                      Imaginez la difficulté pour un Zér0 qui débute de découvrir pourquoi ça ne fonctionnera pas, que ce ne sera pas la fonction avec le pointeur qui sera appelée :

                      1. int doubler( int i )
                      2. {
                      3.     return i * 2;
                      4. }
                      5. int doubler( std::string * s )
                      6. {
                      7.     if( s != NULL )
                      8.         *s += *s;
                      9.     return 1;
                      10. }
                      11. int main()
                      12. {
                      13.     std::cout << doubler( NULL ) << std::endl;
                      14.     return 0;
                      15. }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 décembre 2007 à 11:00:37

                        (Prendre une chaîne par pointeur n'est pas une bonne pratique, mais peu importe.)
                        Mais ... le problème existe aussi dans l'autre sens:
                        1. #include <string>
                        2. #include <iostream>
                        3. void f(std::string const& s) {
                        4.     std::cout << "string&\n";
                        5. }
                        6. void f(int i, int j) { // oubli du =0 sur le second argument
                        7.     std::cout << "int, int\n";
                        8. }
                        9. int main (int argc, char **argv)
                        10. {
                        11.     try
                        12.     {
                        13.         f(0);
                        14.     }
                        15.     catch (std::exception const& e)
                        16.     {
                        17.         std::cerr << "Error: " << e.what() << std::endl;
                        18.     }
                        19.     return 0;
                        20. }


                        Il suffit d'oublier que f() prend deux entiers et que le second n'a pas 0 comme valeur par défaut pour avoir de sacrées surprises.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                        Listes linaires, un problème

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown