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

Free Pascal Discussion :

Clonage d'une liste simplement chaînée [Free Pascal]


Sujet :

Free Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Par défaut Clonage d'une liste simplement chaînée
    Bonjour à tous,

    mon problème est le suivant, je dois réaliser une routine qui clone une liste simplement chaînée. Seulement, je ne vois pas très bien comment la réaliser.
    Je vois bien pour 2 éléments mais après, je bloque ( et même avec des petits dessins ).
    Comme vous pouvez le voir, le éléments clonés à partir du 3e, seront mis avant le 2e... je vois pas du tout comment procéder pour les mettre dans le même ordre que dans la liste originelle.
    Merci de me lire.
    Voici donc les parties de l'unité que j'ai crée.

    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
    96
    97
    98
    99
    100
    procedure   NouvelleListe(var l:Liste);
    begin
    	l:=nil;
     
    end;
     
    (* ------------------------------------------- *) 
     
    function  ListeVide(l:Liste):boolean;
    begin
    	result:=l=nil;
    end;
     
    (* ------------------------------------------- *)
    function  DansListe(e:ElemListe;l:Liste):boolean;
    var temp:Liste;
    begin
    	temp:=l;
    	while (temp<>nil) and not ElemlisteEgal(temp^.info,e) do  
    		begin
    			temp:=temp^.svt;
    		end;
    	result:=temp<>nil;
    end;
     
    (* ------------------------------------------- *)
     
    function  InsererListe(E:ElemListe;var L:Liste):boolean;
    var nouveau:liste;
    begin
    	if (not DansListe(E,L)) then
    		begin
    			new(nouveau);
    			nouveau^.info:=E;
    			nouveau^.svt:=L;
    			L:=nouveau;
    			result:=true;
    		end
    	else
    		result:=false;
    end;
     
    (* ------------------------------------------- *)
     
    procedure InsererModifierListe(E:ElemListe;var l:Liste);
    var nouveau:liste;
    begin
    	nouveau:=l;
    	while (nouveau<>nil) and not ElemlisteEgal(nouveau^.info,e) do  
    			begin
    				nouveau:=nouveau^.svt;
    			end;
    	if nouveau=nil then
    		begin
    			new(nouveau);
    			nouveau^.info:=E;
    			nouveau^.svt:=l;
    			l:=nouveau;
    		end
    	else
    		nouveau^.info:=E;		
    end;
     
    (* ------------------------------------------- *)
     
    procedure Afficherliste(L:liste);
    var temp:liste;
    begin
    	temp:=L;
    	while (temp<>nil) do 
    		begin
    			write(temp^.info,' ');
    			temp:=temp^.svt;
    		end;
    end;
     
    (* ------------------------------------------- *)
     
    procedure ClonerListe(var dest:Liste;source:Liste);
    var svtsource,nouveaudest:Liste;
    begin
    	if source=nil then
    		dest:=nil
    	else
    		begin
    			new(dest);
    			CopyElemListe(dest^.info,source^.info);
    			dest^.svt:=nil;
    			svtsource:=source^.svt;
    			while (svtsource<>nil) do 
    				begin
    					new(nouveaudest);
    					CopyElemListe(nouveaudest^.info,source^.info);
    					nouveaudest^.svt:=dest^.svt;
    					dest^.svt:=nouveaudest;
    					svtsource:=source^.svt
    				end;
    			nouveaudest^.svt:=nil;
    		end;
    end;

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Il te faut faire avec un pointeur temporaire au lieu d'utiliser dest, car dest doit rester un pointeur sur la premier cellule de ta chaîne. Ensuite, toutes les opérations doivent se faire avec ce pointeur temporaire.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Par défaut
    Bonjour et merci pour ta réponse.

    J'ai fait exactement ce que tu m'as dit sur le code ci-dessus.
    Dest pointe vers la première cellule de la liste, nouveaudest étant le pointeur temporaire.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Par défaut
    Voilà, j'ai apporté des corrections. Ça marche, cependant, il me reste encore un problème à l'affichage de la liste clonée.
    Voilà ce qui s'affiche sur la console:

    voici la liste 2(liste clone) \377 \377 \377 \377 \377

    Et voici ma routine de Clone:

    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
    procedure ClonerListe(var dest:Liste;source:Liste);
    var svtsource,nouveaudest:Liste;
    begin
    	if source=nil then
    		dest:=nil
    	else
    		begin
    			new(dest);
    			CopyElemListe(dest^.info,source^.info);
    			svtsource:=source^.svt;
    			nouveaudest:=dest;
    			while (svtsource<>nil) do 
    				begin
    					new(nouveaudest^.svt);
    					nouveaudest:=nouveaudest^.svt;
    					CopyElemListe(nouveaudest^.info,source^.info);
    					svtsource:=svtsource^.svt
    				end;
    			nouveaudest^.svt:=nil;
    		end;
    end;

    et tant qu'on y est, ma procédure Affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure Afficherliste(L:liste);
    var temp:liste;
    begin
    	temp:=L;
    	while (temp<>nil) do 
    		begin
    			write(temp^.info,' ');
    			temp:=temp^.svt;
    		end;
    end;
    Merci de me lire

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Est-ce que ta procédure CopyElemListe fonctionne bien ? Quel est le type du champ info dans ta liste chaînée ?

    Regarde du côté de la ligne CopyElemListe(nouveaudest^.info,source^.info); dans le clonage.

    Aussi, vérifie bien que write fonctionne correctement pour le champ de ta liste.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Par défaut
    Et bien, la routine Affiche marche bien car la liste source s'affiche sans problème.

    Voilà ma procédure CopyElemListe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure CopyElemListe(el1,el2:ElemListe); (* où ElemListe est de type char*)
    begin
    	el1:=el2;
    end;

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

Discussions similaires

  1. petite erreur d'implémentation dans une liste simplement chaînée
    Par johnny3 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 26/10/2008, 16h57
  2. Réponses: 9
    Dernier message: 14/01/2007, 17h09
  3. Réponses: 3
    Dernier message: 25/10/2006, 19h08
  4. Probleme liste simplement chaînée
    Par sorry60 dans le forum C
    Réponses: 23
    Dernier message: 19/11/2005, 20h17

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