Liste chainée!

Résolu
Samou85 Messages postés 46 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 7 octobre 2009 - 28 juil. 2009 à 22:11
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 30 juil. 2009 à 19:08
Bonjour à tous!


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

MERCI!

14 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
29 juil. 2009 à 18:01
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;
3
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 juil. 2009 à 12:46
Ben tu fais une copie de chaîne ou au pire une copie de mémoire ... précise ta question.

Cordialement, Bacterius !
0
Samou85 Messages postés 46 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 7 octobre 2009
29 juil. 2009 à 14:24
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!
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 juil. 2009 à 15:46
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 juil. 2009 à 15:50
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 !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 juil. 2009 à 18:21
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 !
0
Samou85 Messages postés 46 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 7 octobre 2009
29 juil. 2009 à 23:04
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!
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 juil. 2009 à 23:22
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 !
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
29 juil. 2009 à 23:57
c'est tout a fait ça.
0
Samou85 Messages postés 46 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 7 octobre 2009
30 juil. 2009 à 00:06
OK Merci, mais je ne vois pas pourquoi le premier élément de la liste à créer serait en entrée dans la fonction!!!
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 juil. 2009 à 00:20
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 !
0
Samou85 Messages postés 46 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 7 octobre 2009
30 juil. 2009 à 12:45
Merci Bacterius pour la précision; et comment on crée la liste de destination,??? (avec un New(Dst))????
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 juil. 2009 à 13:04
Ben de la même façon que tu as créé la liste à copier ?

Cordialement, Bacterius !


 
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
30 juil. 2009 à 19:08
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.
0
Rejoignez-nous