Question pour les programmeurs en Pascal

Réduire
X
 
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages
  • Mr Dus
    Compte archivé

    • mai 2001
    • 1370

    #1

    Question pour les programmeurs en Pascal

    oui j'ai un exam mardi ap midi et je ne comprends pas un truc sur les pointeurs :
    c'est cette histoire de liste chainée, quand on en cree une et qu'on veut faire appelle a la valeur "suivant" que se passe t-il en fait ?
    j'explique
    voici la déclaration

    type t_lien = ^t_element;

    t_element = record
    nom : string;
    age : integer;
    suivant : t_lien;
    end;

    var liste : t_lien;

    procedure creation (var liste:t_lien);

    var nomlu :string;
    agelu :integer;
    courant : t_lien;

    begin
    repeat
    {là y'a le programme qui demande d'entrer les noms et ages}

    courant^.age=agelu;
    courant^.nom=nomlu;
    courant^.suivant = Liste;
    Liste = courant;

    {c'est ces deux dernières lignes que je ne comprends pas.}

    until length(nom) = 0;

    Voilà si quelqu'un sait m'expliquer (sans qu'il se prenne trop la tete non plus) ça m'aiderait bien. paske là sur cet exemple je saurais le refaire en par coeur mais pendant l'exam...




    J'ai modifié un truc faux dans mon exemple alors du coup si vous captez pas les deux posts suivant (aaargh encore un suivant !!) c'est normal [img]/forum/images/smiles/icon_wink.gif[/img]

    <font size=-1>[ This Message was edited by: Mr Dus on 2001-06-10 18:02 ]</font>

    <font size=-1>[ This Message was edited by: Mr Dus on 2001-06-10 18:04 ]</font>
    [IMG]http://down.cricou.net/forbine/forum/html/emoticons/aadehors.gif[/IMG]
  • Thierry
    Compte archivé

    • mai 2001
    • 2427

    #2
    Ca fait (très) longtemps que j'ai pas fait de Pascal (peut-être 15 ans), mais bon, je vais quand même essayer de comprendre...

    Normalement le membre "suivant" doit te faire pointer sur une autre cellule. Par contre dans ton exemple il manque la déclaration de "debut". Il faudrait que tu la recherches dans ton exemple pour aller un peu plus loin...

    Quick to judge, quick to anger, slow to understand
    Ignorance and prejudice and fear walk hand in hand

    Commentaire

    • Mr Dus
      Compte archivé

      • mai 2001
      • 1370

      #3
      ha pardon c'est pas debut c'est liste (je l'avais changé dans mon exemple paske debut je trouve ça nul et zarbi dans ce [img]/forum/images/smiles/icon_smile.gif[/img]
      [IMG]http://down.cricou.net/forbine/forum/html/emoticons/aadehors.gif[/IMG]

      Commentaire

      • Thierry
        Compte archivé

        • mai 2001
        • 2427

        #4
        Bon alors je me lance... Excuses moi d'avance si je dis des conneries et que je te fais louper ton devoir, je ne sais plus comment le Pascal gère les allocations. Le mieux pour comprendre c'est peut-être d'y aller pas à pas. "courant" contient la cellule que tu es en train de construire, "liste" ta liste complète.

        au début :
        courant=NULL
        liste=NULL

        1ère itération :

        courant->age=AGE1
        courant->nom=NOM1
        courant->suivant=NULL {valeur de liste)
        Puis tu fais liste=courant donc
        liste->age=AGE1
        liste->nom=NOM1
        liste->suivant=NULL {valeur de liste)

        A la fin de la 1ère itération liste et courant sont donc égales (la liste = sa première cellule)

        2ème itération :

        courant->age=AGE2
        courant->nom=NOM2
        courant->suivant=liste

        Donc si je schématise
        courant->age=AGE2
        courant->nom=NOM2
        courant->suivant->age=AGE1
        ->nom=NOM1
        ->suivant=NULL
        en faisant courant->suivant=liste tu viens de "chainer" ta nouvelle cellule "courant" à ta liste de cellule "liste". "courant" est maintenant une liste aussi, contenant 2 cellules, celle que tu viens de construire et celle contenue dans "liste".

        Quand tu fais liste=courant tu mets dans "liste" tes deux cellules.

        Les itérations suivantes fonctionnent de la même façon : "courant" te permet de créer une nouvelle cellule et de la chainer à ta liste, puis liste=courant recopie toute la structure de "courant" dans "liste" de façon à ce que tu puisse réutiliser "courant" pour une nouvelle cellule.

        J'espère que je t'ai pas trop embrouillé et surtout que j'ai pas dit de bêtises [img]/forum/images/smiles/icon_wink.gif[/img]

        Quick to judge, quick to anger, slow to understand
        Ignorance and prejudice and fear walk hand in hand

        Commentaire

        • galaan
          Compte archivé

          • avril 2001
          • 870

          #5
          Mamammia j' ai rien compri!
          Enfin bon C un peu normal mais ça quand meme l' air carrément chaud!
          Bonne chance pour tes exams Mr Dus [img]/forum/images/smiles/icon_smile.gif[/img] <!-- BBCode Start --><IMG SRC="http://cwm.ragesofsanity.com/cwm/cwm/silly.gif" BORDER="0"><!-- BBCode End -->

          <font size=-1>[ This Message was edited by: galaan on 2001-06-10 20:11 ]</font>
          :bigjunk: [i]J' ai atteint une totale liberté cosmique vers un nouvel age réminiscent[/i] :bigjunk:

          Commentaire

          • Mr Dus
            Compte archivé

            • mai 2001
            • 1370

            #6
            Donc si je comprends bien la cellule vide ne se trouve pas apres comme je le croyais mais avant les ittérations ?
            En tout cas je te remercie thierry c'est suffisament clair pour que j'ai compris le fonctionnement (et c'est pas un luxe [img]/forum/images/smiles/icon_smile.gif[/img] )

            j'ai aussi peur qu'il y ai un truc genre Liste^.précédent mais je pense que ça ne doit pas être bien différent.
            enfin merci encore [img]/forum/images/smiles/icon_smile.gif[/img]

            Ps: merci pour tes encouragements Galaan [img]/forum/images/smiles/icon_smile.gif[/img]
            [IMG]http://down.cricou.net/forbine/forum/html/emoticons/aadehors.gif[/IMG]

            Commentaire

            • Thierry
              Compte archivé

              • mai 2001
              • 2427

              #7
              Oui, c'est ça, la cellule "courant" se retrouve toujours en première position quand tu la chaînes à la liste (courant->suivant=liste)

              Pour la liste doublement chaînée (avec precedent), ça doit être presque pareil. L'avantage c'est que les déplacements sont plus rapides, tu peux reculer quand tu parcours la liste, tandis qu'avec ton premier exemple (liste chaînée simple), pour aller rechercher un élément tu dois toujours partir du premier élément, et parcourir les autres par l'intermédiaire de "suivant".

              Quand tu veux comprendre un algo un peu compliqué je te conseille de faire des dessins et de regarder pas à pas comment ça se passe.

              Bonne chance !

              Quick to judge, quick to anger, slow to understand
              Ignorance and prejudice and fear walk hand in hand

              Commentaire

              • Mr Dus
                Compte archivé

                • mai 2001
                • 1370

                #8
                merci !
                [IMG]http://down.cricou.net/forbine/forum/html/emoticons/aadehors.gif[/IMG]

                Commentaire

                Chargement...