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 :

[LG]inserer dans une liste chainee


Sujet :

Langage Pascal

  1. #1
    Membre à l'essai
    Inscrit en
    mars 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 18
    Points : 16
    Points
    16
    Par défaut [LG]inserer dans une liste chainee
    salut;
    dans un programme je suis besoin d'une liste chainee de caractere j'ai fait une procedure qui inser a la fin d'une liste chainee mais ca ne marche pas j'ai fait le code suivant pour la procedure:
    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
     
    procedure          inserfin(var x:mot;f:char);
       var
    	q,w:mot;
    	begin
    	     new(w);
    	     w^.symbole:=f;
    	     w^.suivant:=nil;
    	     if x=nil then
      	         x:=w
    	     else
    	begin
         	     q:=x;
         	     while q<>nil do
         	        q:=q^.suivant;
         	        q:=w;
     	   end;
    	        end;
    mot c'est un type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    type  
          mot=^lettre;
          lettre=record
    	symbole:char;
    	suivant:mot;
          end;
    j'ai fait une procedure pour charger la liste chainee:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            procedure            givmot(var x:mot);
            var
    	i,n:integer;
    	c:string;
    	begin
                writeln('donner votre chaine');
    		readln(c);
    		n:=length(c);
    		for i:=1 to n do
    		inserfin(x,c[i]);
    	end;
    et pour afficher la liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
           procedure  affich(x:mot);
           var q:mot;
    	begin
    	q:=x;
    	   while q<>nil do
    	begin
    		write(q^.symbole);
    		q:=q^.suivant;
    		end;
    		writeln('  fin');
    	end;
    je fait l'appelle dans mon programme principale le probleme que l'afichage de la liste ne donne que le premier caractere,
    l'objectif de mon programme c'est de faire un petite automate pour voire est ce qu'un mot est il accepter par l'automate ou non,tous est apparu normale ,je ne sais pas ou est le probleme.
    merci de vos reponces et suggestions

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    avril 2002
    Messages
    2 452
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : avril 2002
    Messages : 2 452
    Points : 4 232
    Points
    4 232
    Par défaut
    L'erreur vient de ta procédure d'insertion en fin : lorsque la chaîne n'est pas vide (x<>nil) la boucle que tu fais avec q n'utilise pas la bonne condition. Tu parcours la liste entière jusqu'à ce que q soit nil, donc q ne pointe sur rien à la fin de la boucle, et tu affectes à q une valeur, donc q prend la valeur, mais ta chaîne n'est pas affectée, car q n'a plus aucun lien avec ta chaîne (c'est pas très clair si ?). En gros, tu affectes une valeur à une variable qui n'est plus en relation avec ta chaîne. Le problème vient de la condition du while : il faut que tu t'arretes à la dernière cellule c'est-à-dire que le pointeur suivant vaut nil. Ainsi tu es sûr que q pointe sur la dernière cellule de la liste. Il te suffit alors d'affecter la valeur w à q^.suivant :
    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          inserfin(var x:mot;f:char); 
       var 
       q,w:mot; 
       begin 
            new(w); 
            w^.symbole:=f; 
            w^.suivant:=nil; 
            if x=nil then 
                  x:=w 
            else 
       begin 
                 q:=x; 
                 if q<>nil then  {q^.suivant n'existe pas si q=nil !!}
                 begin
                 while q^.suivant<>nil do q:=q^.suivant; 
                    q^.suivant:=w; 
                 end;
           end; 
               end;
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    avril 2002
    Messages
    2 452
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : avril 2002
    Messages : 2 452
    Points : 4 232
    Points
    4 232
    Par défaut
    D'ailleurs on pourrait concevoir un algorithme un peu plus clair pour l'insertion en fin :

    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
     
    procedure inserfin(var x:mot;f:char); 
    var q,w:mot; 
    begin 
       new(w); 
       w^.symbole:=f; 
       w^.suivant:=nil; 
       q:=x; 
       if q<>nil then 
       begin 
          while q^.suivant<>nil do q:=q^.suivant; 
          q^.suivant:=w; 
       end;
       else x:=w;
    end;
    Voilà !
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  4. #4
    Membre à l'essai
    Inscrit en
    mars 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 18
    Points : 16
    Points
    16
    Par défaut merci;ca va maintenant
    salut,
    merci por votre reponce j'ai ete sure que il sagit d'un truc simple,je vous remercier infiniment quand meme
    je vous didier et a toutes les informaticient mon programme
    c'est un simulateur d'un automate a quatre etat 0.1.2.3
    le longage est forme de deux lettre a et b.

    c'est le debut pour creer petit un compilateur ,donc mon programme entre dans le cadre de la compilation
    merci


    Code trop long supprimé par Hdd34
    Merci de penser au tag Résolu

  5. #5
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    avril 2002
    Messages
    2 452
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : avril 2002
    Messages : 2 452
    Points : 4 232
    Points
    4 232
    Par défaut
    C'était avec plaisir ! N'hésites surtout pas à revenir si tu as un problème quelconque, nous sommes là pour ça !

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 26/10/2006, 23h43
  2. insertion d'objets dans une liste chainee
    Par mathher dans le forum C++
    Réponses: 8
    Dernier message: 20/04/2006, 16h28
  3. [LG]probleme d'ajout dans une liste chainée...
    Par misteryann dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2004, 20h28
  4. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  5. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20

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