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

Langage Pascal Discussion :

Listes chaînées circulaires


Sujet :

Langage Pascal

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Listes chaînées circulaires
    Bonsoir,
    je suis nouveau sur le forum. Je n'arrive pas à créer une liste chaînée circulaire. J'ai déjà fait quelque chose mais cela ne marche pas dans Free Pascal, je pense qu'il doit y avoir une erreur quelque part. Donc si vous pouviez m'aider

    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
    program liste_circulaire;
     
    type pliste_simple=^element;
    	element=record
    		val:integer;
    		suiv:pliste_simple;
    	end;
     
    function liste_vide(var tete:pliste_simple):pliste_simple;
    begin
         liste_vide:=NIL;
    end;
     
    function insertion(var tete:pliste_simple;x:integer):pliste_simple;
    var
      nouv,prec,cour:pliste_simple;
    begin
      new(nouv);
      nouv^.val:=x;
    {Insertion liste vide ou en tete de liste}
      if (tete=NIL) or (tete^.val>x) then
        begin
          nouv^.suiv:=tete;
          insertion:=nouv;
          exit
        end
      else
    {Insertion en milieu et fin de liste}
        begin
          prec:=tete;
          cour:=tete^.suiv;
          while (cour<>NIL) and (cour^.val<x) do
            begin
              prec:=prec^.suiv;
              cour:=cour^.suiv;
            end;
          nouv^.suiv:=cour;
          prec^.suiv:=nouv;
          insertion:=tete;
        end;
    end;
     
    procedure afficher2(tete:pliste_simple);
    var
      ptr:pliste_simple;
    begin
      ptr:=tete;
      if (ptr=NIL) then
        begin
          writeln('Tete -> NUL, la liste est vide');
        end
      else
        begin
          write('Tete -> ');
          while (ptr<>NIL) do
          begin
            write(ptr^.val,' -> ');
            ptr:=ptr^.suiv;
          end;
          writeln('Tete');
        end;
    end;
     
    var 
    	liste, tete, precedent, dernier, cour:pliste_simple;
    	n,i:integer;
     
    begin 
    	liste:=liste_vide(liste);
    	write('Combien d''elements?');
        readln(n);
    	new(tete);
    	tete^.val := 1;
    	precedent:=tete;
    	for i:=2 to n-1 do
    	begin
    		liste:=insertion(tete,i);
    	end;
     
    	new(dernier);
    	dernier^.val := n;
    	precedent := tete;
    	cour := tete^.suiv;
    	while (cour<>Tete) and (cour^.val < dernier^.val) do
    		begin
    			precedent := precedent^.suiv;
    			cour := cour^.suiv;
    		end;
    	dernier^.suiv:=tete;
    	precedent^.suiv:= dernier;
     
    	writeln('Affichage de la liste');
    	afficher2(liste);
    	readln;
    end.
    Merci d'avance.

  2. #2
    Membre éprouvé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Points : 917
    Points
    917
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (ptr<>NIL) do
          begin
            write(ptr^.val,' -> ');
            ptr:=ptr^.suiv;
          end;
          writeln('Tete');
    attention, dans affiche, si ta liste est circulaire, ptr ne sera jamais egal a null

    voici un pseudo code

    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
     
     
    si la list est vide (list = NIL):
      on aloue un element
      on fais pointer son next sur lui meme
      puis on assigne : list = elem;
     
    si la liste n'est pas vide ? 
      on alloue aussi un element
     
      on sauvegarde l'adresse de la liste dans une variable (ici save)
      tant que (list^.suiv <> save) //on va la fin de la liste
        list = list^.suiv;
      fin
      un swap a faire : 
      elem^.suiv = list^.suiv OU elem^.suiv = save; 
      list^.suiv = elem;
     
      on retablie l'adresse de debut :
      list = save;
    attention a envoyer la liste par variable, si tu changes l'adresse du premier element de la liste (liste NULL), autrement, tu n'as pas besoins des parties qui consistent a retablir l'adresse


  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'ai refait le code, en ayant modifié que ceux que vous m'aviez dit, et également enlevé quelques lignes qui servaient à rien.. Mais toujours rien, ça me fait toujours "exit code : 216" . Merci au fait !

    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
    program liste_circulaire;
     
    type pliste_simple=^element;
        element=record
            val:integer;
            suiv:pliste_simple;
        end;
     
    function liste_vide(var tete:pliste_simple):pliste_simple;
    begin
         liste_vide:=NIL;
    end;
     
    function insertion(var tete:pliste_simple;x:integer):pliste_simple;
    var
      nouv,prec,cour:pliste_simple;
    begin
      new(nouv);
      nouv^.val:=x;
    {Insertion liste vide ou en tete de liste}
      if (tete=NIL) then
        begin
          nouv^.suiv:=nouv;
          insertion:=nouv;
          exit
        end
      else
    {Insertion en milieu et fin de liste}
        begin
          prec:=tete;
          cour:=tete^.suiv;
          while (cour<>Tete) do
            begin
              prec:=prec^.suiv;
              cour:=cour^.suiv;
            end;
          nouv^.suiv:=cour;
          prec^.suiv:=nouv;
          insertion:=tete;
        end;
    end;
     
    procedure afficher2(tete:pliste_simple);
    var
      ptr:pliste_simple;
    begin
      ptr:=tete;
      if (ptr=NIL) then
        begin
          writeln('Tete -> NUL, la liste est vide');
        end
      else
        begin
          write('Tete -> ');
          while (ptr<>Tete) do
          begin
            write(ptr^.val,' -> ');
            ptr:=ptr^.suiv;
          end;
          writeln('Tete');
        end;
    end;
     
    var
        liste, tete,dernier, cour:pliste_simple;
        n,i:integer;
     
    begin
        liste:=liste_vide(liste);
        write('Combien d''elements?');
        readln(n);
        new(tete);
        tete^.val := 1;
        for i:=2 to n-1 do
        begin
            liste:=insertion(tete,i);
        end;
     
        new(dernier);
        dernier^.val := n;
    	dernier^.suiv := tete;
        cour := tete;
        while (cour^.val < n) do
            begin
                cour := cour^.suiv;
            end;
        cour^.suiv:=dernier;
     
     
        writeln('Affichage de la liste');
        afficher2(liste);
        readln;
    end.

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 550
    Points : 3 916
    Points
    3 916
    Par défaut
    Salut

    Le commentaire dans ta fonction Insertion est trompeur, si j'ai bien compris, le nouvel élément est ajouté en fin, le mode var du passage de paramètre dans cette fonction est superflu car tete n'est jamais modifié. un code plus simple est alors possible :
    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
    function insertion(tete:pliste_simple;x:integer):pliste_simple;
    var
      nouv, cour:pliste_simple;
    begin
      new(nouv);
      nouv^.val:=x;
    {Insertion liste vide ou en tete de liste}
      if (tete=NIL) then
        begin
          nouv^.suiv:=nouv;
          insertion:=nouv;
          exit
        end
      else
        begin
          (* atteindre le dernier élément *)
          cour := tete;
          while (cour.suiv<>tete) do
            cour := cour^.suiv;
          (* Ajout du nouvel élément en fin de liste *)
          nouv^.suiv := cour^.suiv;
          cour^.suiv := nouv;
          insertion := tete;
        end;
    end;
    pour l'affichage, la condition while (ptr<>Tete) est incohérente avec l'initialisation de ptr, on peut également écrire :

    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
    procedure afficher2(tete:pliste_simple);
    var
      ptr:pliste_simple;
    begin
      ptr:=tete;
      if (ptr=NIL) then
        begin
          writeln('Tete -> NUL, la liste est vide');
        end
      else
        begin
          ptr := Tete;
          write('Tete');
          repeat
            write(' -> ');
            write(ptr^.val);
            ptr := ptr^.suiv;
          until ptr = tete;      
        end;
    end;
    Teste le code, je ne peux pas le faire.
    Pour les insertions ordonnée, crée une nouvelle fonction InsertionOrdre et tiens-nous au courant

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

Discussions similaires

  1. [Free Pascal] Liste chaînée circulaire
    Par Nir3x dans le forum Free Pascal
    Réponses: 1
    Dernier message: 20/05/2013, 13h08
  2. Insertion dans liste chaînée circulaire
    Par Cladouros dans le forum Débuter
    Réponses: 13
    Dernier message: 17/10/2010, 20h22
  3. Liste doublement chaînée circulaire sans tampon
    Par tekthoninks dans le forum Langage
    Réponses: 0
    Dernier message: 07/05/2009, 01h29
  4. Réponses: 9
    Dernier message: 14/01/2007, 18h09
  5. Listes chaînées circulaires
    Par gege2061 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 11/05/2005, 14h44

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