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 :

Gestion d'une file doublement chaînée


Sujet :

Langage Pascal

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Gestion d'une file doublement chaînée
    Bonjour à tous !

    Je fais appel à vous car j'ai un problème lors de l’exécution que je ne comprend pas...
    J'ai pour devoir de faire une file doublement chaînée avec les fonctions/procédures suivantes :
    -Ajout
    -Suppression
    -File pleine
    -File vide

    Voici ce que j'ai compris des files:
    Le doublement chaînée consiste a avoir une circulation a double sens avec aux extrémités de la file un début et une fin.
    Le principe FIFO(First In, First Out).
    Donc une cellule aura un champs précédent, valeur et suivant.

    Voici mon code pour l'ajout :
    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
    procedure InitFile;
    var
      pt_courant, temp, prem: PFileElem;
      i: integer;
    begin
      write('Combien d elements?');
      readln(n);
      write('1ere valeur ? ');
      new(prem);
      readln(prem^.valeur);
      fin := prem^.suivant;
      prem^.suivant := nil;
      debut := prem;
      j := j + 1;
     
      for i := 2 to n do
      begin
        new(temp);
        write(i, 'ieme valeur ? ');
        readln(temp^.valeur);
        temp^.suivant := debut;
        debut := temp;
        j := j + 1;
      end;
     
      while temp <> nil do
      begin
        pt_courant := temp^.suivant;
        pt_courant^.precedent := temp;
        temp := temp^.suivant;
      end;
    end;
    Aucune erreur de compilation, je le précise.
    Dans le while, je chercher a créer les pointeurs des champs "précédent" de chaque cellule de la file.
    Sans le while, tout fonctionne parfaitement ! Mais avec le while... Runtime Error 216 ! La fameuse...
    Je ne comprend pas l'erreur... j'ai fais sur papier, pour moi sa devrait fonctionner !

    Si vous connaissez une autre méthode pour créer ces pointeurs précédents, n'hésitez pas !

    Voici un l'execution de mon programme sans le "While" :
    Nom : Capture.PNG
Affichages : 198
Taille : 6,2 Ko

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour et bienvenue,

    Quand j'exécute ton code sur papier, je tombe à un moment donné sur un temp à NIL dans cette instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while temp <> nil do
      begin
        pt_courant := temp^.suivant;
    Donc temp^.suivant déclenche une erreur fatale.

    Et il est possible de simplifier tout cela en une seule boucle.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci ce votre réponse aussi rapide !
    Je n'ai plus d'erreur avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while temp^.suivant<>nil do
      begin
    	pt_courant:=temp^.suivant;
    	pt_courant^.precedent:=temp;
    	temp:=temp^.suivant;
      end;
    Et comment peut-on faire plus simple ? J'ai réfléchis et je ne vois pas trop appart cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while temp^.suivant<>nil do
      begin
    	temp^.suivant^.precedent:=temp;
    	temp:=temp^.suivant;
      end;

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Voici un petit exemple de création de file en une seule boucle :
    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
    Program DoubleChainage;
     
    {$mode objfpc}{$H+}
     
    Uses
      {$IFDEF UNIX}{$IFDEF UseCThreads}
      cthreads,
      {$ENDIF}{$ENDIF}
      Classes,
      Crt;
     
    Type
      pElement = ^tElement;
      tElement = Record
                   Contenu : Integer;
                   pPrec : pElement;   (* Pointeur vers l'élément précédent *)
                   pSuiv : pElement;   (* Pointeur vers l'élément suivant *)
                 end;
     
    Var
      pTete : pElement;     (* Tête de la file *)
      pQueue : pElement;    (* Queue de la file *)
      Element : pElement;   (* Elément *)
      ElementASupprimer : pElement;   (* Elément à désallouer à la fin *)
      i : Integer;
     
    Begin
      (* Création de la file *)
      pTete := Nil;
      pQueue := Nil;
      for i := 1 to 10 do
        begin
          New(Element);
          Element^.Contenu := i;
          Element^.pSuiv := Nil;
          if pTete = Nil
             then
               pTete := Element
             else
               begin
                 pQueue^.pSuiv := Element;
                 Element^.pPrec := pQueue;
               end;
          pQueue := Element;
        end;
      (* Affichage de la file *)
      Element := pQueue;
      while (Element <> Nil) do
        begin
          WriteLn(Element^.Contenu);
          Element := Element^.pPrec;
        end;
      (* Désallocation des variables dynamiques *)
      Element := pTete;
      while (Element <> Nil) do
        begin
          ElementASupprimer := Element;
          Element := Element^.pSuiv;
          Dispose(ElementASupprimer);
        end;
    End.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

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

Discussions similaires

  1. gestion d'une file d'attente avec report 10G
    Par sithe dans le forum Reports
    Réponses: 0
    Dernier message: 15/06/2011, 01h49
  2. Debutant , gestion d'une file , segmentation fault
    Par Freedom57 dans le forum Débuter
    Réponses: 4
    Dernier message: 22/12/2010, 16h52
  3. Déplacement dans une liste doublement chaînée
    Par Adenora dans le forum Débuter
    Réponses: 9
    Dernier message: 19/10/2010, 15h43
  4. Réponses: 9
    Dernier message: 14/01/2007, 17h09
  5. Gestion d'une file d'attente
    Par jesus144 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/09/2005, 19h58

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