Liste chainée! [Résolu]

Messages postés
46
Date d'inscription
mardi 2 juin 2009
Statut
Membre
Dernière intervention
7 octobre 2009
- - Dernière réponse : f0xi
Messages postés
4278
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
- 30 juil. 2009 à 19:08
Bonjour à tous!


je voudrais savoir comment faire une copie d'une liste chainée!

MERCI!
Afficher la suite 

14 réponses

Meilleure réponse
Messages postés
4278
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
3
Merci
non bacterius, une liste chainée n'est pas forcement au même emplacement memoire que les données.

ce sont des pointeurs créés sur le tas, donc il peuvent être n'importe ou en memoire.


avec ceci :

type
  PListeElem = ^TListeElem;
  TListeElem = record
    Elem: string;
    Suiv: PListeElem;
  end; 

var
  ListeElem : PListeElem;


function CopyListeElem(const SrcFirstElem, DestFirstElem : PListeElem): integer;
var Src, Dst : PListeElem;
begin
  result := 0;
  Src := SrcFirstElem;
  Dst := DestFirstElem;
  if (Src nil) or (Dst nil) then 
    exit;

  Dst^.Elem := Src^.Elem;
  Result := 1;

  if Src^.suiv <> nil then
    repeat
      New(Dst^.Suiv);
      Dst := Dst^.Suiv;
      Dst^.Elem := Src^.Elem;
      Src := Src^.Suiv;
      inc(result);
    until Src^.Suiv = nil;
end;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 122 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Ben tu fais une copie de chaîne ou au pire une copie de mémoire ... précise ta question.

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
46
Date d'inscription
mardi 2 juin 2009
Statut
Membre
Dernière intervention
7 octobre 2009
0
Merci
Je vais essayer de préciser ma question, en fait j'ai une liste chainée
qui est déclaré de cette façon:

type
PListeElem = ^TListeElem;
TListeElem = record
Elem: string;
Suiv: PListeElem;
end;
et je voudrais créer une liste chainée qui contienne les memes éléments que la première, voilà, j'espere que c'est plus claire!

MERCI!
Commenter la réponse de Samou85
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Mais ta liste chaînée est déclarée comment ?
Si tu veux que ça soit plus simple, utilise un ShortString à la place d'un String !

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Ah ouais je vois ...
Ben tu refais une autre liste chaînée à côté, avec le même nombre d'éléments, tu définis "Suiv" pour chaque objet comme d'habitude, puis ensuite tu parcoures les 2 listes, puis tu fais un CopyMemory (ou un "Move") sur "Elem", depuis la liste source jusqu'à la liste destination.
Montre ton code pour voir ?

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
f0xi, tu veux donc dire que Elem et Suiv ne se suivent pas dans la mémoire ? Ah ben oui ça change tout ...

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
46
Date d'inscription
mardi 2 juin 2009
Statut
Membre
Dernière intervention
7 octobre 2009
0
Merci
D'abord merci fOxi et Bacterius de vos réponses!

je suis assez d'accord avec ton code fOxi mais j'ai quand meme des questions:

1)Je n'ai pas compris ce que sont sensés représenter les deux constantes: const SrcFirstElem, DestFirstElem : PListeElem ????

2)pourquoi la fonction rend un entier comme résultat(c'est le nombre d'éléments)???

MERCI de me répondre!
Commenter la réponse de Samou85
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Je vais tenter de répondre

1) SrcFirstElem représente le premier élément de la liste chaînée à copier, et DestFirstElem le premier élément de la liste chaînée de destination. (Je pense)

2) Elle rend le nombre d'éléments de la liste chaînée, effectivement. (Je pense)

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
4278
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
0
Merci
c'est tout a fait ça.
Commenter la réponse de f0xi
Messages postés
46
Date d'inscription
mardi 2 juin 2009
Statut
Membre
Dernière intervention
7 octobre 2009
0
Merci
OK Merci, mais je ne vois pas pourquoi le premier élément de la liste à créer serait en entrée dans la fonction!!!
Commenter la réponse de Samou85
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Ben tout simplement pour savoir où on doit copier la liste chaînée source ?
Précision : la fonction que f0xi propose ne crée pas une 2eme liste de destination, tu dois la créer toi-même.

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
46
Date d'inscription
mardi 2 juin 2009
Statut
Membre
Dernière intervention
7 octobre 2009
0
Merci
Merci Bacterius pour la précision; et comment on crée la liste de destination,??? (avec un New(Dst))????
Commenter la réponse de Samou85
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Ben de la même façon que tu as créé la liste à copier ?

Cordialement, Bacterius !


 
Commenter la réponse de Bacterius
Messages postés
4278
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
0
Merci
oui avec :

var
Src : PListeElem;
Dst : PListeElem;


...

var
K : integer;
begin
New(Dst);
K := CopieListeElem(Src, Dst);
...
end;


sinon tu peux utiliser une classe TStringList en alternative a la liste chainée.
Commenter la réponse de f0xi