Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal > Langage
Langage Vos questions sur langage Pascal en général, ses évolutions, les technologies, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/10/2011, 16h20   #1
timetheo
Invité de passage
 
Inscription : mai 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 4
Points : 0
Points : 0
Par défaut Inversion de liste chaînée

Bonjour,
je travaille avec TP7 sous windows xp, j'ai un problème avec les listes chainées :
la partie remplissage et affichage de ma liste marche bien,
mais ensuite j'essaie d'inverser ma liste dans une autre liste, et là ça ne marche pas...
lors de l'exécution du programme une erreur se produit à cette étape :
erreur 203 : Heap overflow error (dépassement de tas)
Je pense que c'est parce que mon code n'est pas bon bien sur, car a priori la manipulation souhaitée n'a rien d'extraordinaire).
Quelqu'un pourrait-il corriger la partie où j'essaie d'inverser ma liste dans une deuxième liste ?

Par avance merci,

blm.

Voici mon code complet :

Code :
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
program liste_chainee_entiers;
 
type  Tptr_cellule = ^Tcellule;
 
      Tcellule = record
                    valeur:integer;
                    suivant:Tptr_cellule;
                    end;
 
var debut, nouveau, debut2 : Tptr_cellule;
    reponse : char;
    n : integer;
    stop : boolean;
 
begin
reponse:='o';
new(debut);
writeln('Entrer un entier');
readln(debut^.valeur);
writeln('Voulez-vous continuer la saisie d''entiers ? o/n ');
readln(reponse);
 
while (reponse='o') do
      begin
      writeln('Entrer un entier');
      readln(n);
      new(nouveau);
      nouveau^.valeur:=n;
      nouveau^.suivant:=debut;
      debut:=nouveau; {de la sorte le nouvel ‚l‚ment est ajout‚ en d‚but de liste}
      writeln('Voulez-vous continuer la saisie d''entiers ? o/n ');
      readln(reponse);
      end;
 
n:=1;
stop:=false;
while (not stop)
      do
        begin
        if (debut^.suivant=nil) then stop:=true;
        writeln('L''entier n§',n,' de la liste est : ',debut^.valeur);
        debut:=debut^.suivant;
        n:=n+1;
        end;
readln;
{reecriture de la liste dans l'autre sens}
new(debut2);
 
stop:=false;
while (not stop)
      do
        begin
 
        new(nouveau);
        nouveau^.valeur:=debut^.valeur;
        nouveau^.suivant:=debut;
        debut2:=nouveau;
        if (debut^.suivant=nil) then stop:=true;
        end;
 
n:=1;
stop:=false;
while (not stop)
      do
        begin
        if (debut2^.suivant=nil) then stop:=true;
        writeln('L''entier n§',n,' de la liste est : ',debut2^.valeur);
        debut2:=debut2^.suivant;
        n:=n+1;
        end;
 
readln;
 
end.
timetheo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 19h25   #2
M.Dlb
Rédacteur/Modérateur
 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 275
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 275
Points : 3 382
Points : 3 382
Attention avec tes variables début et début2. En général ces valeurs ne doivent plus changer une fois que ta liste est remplie de valeurs, car sinon tu perds justement le début.

Pour parcourir une liste chaînée, on utilise une variable temporaire plutôt que de modifier le début. De la même façon, il faut passer par des variables temporaires pour ajouter des cellules d'une nouvelle liste.

Aussi, tu alloues début2, mais ça n'a pas d'intérêt puisque juste après, tu alloues une cellule temporaire avec la variable nouveau.

Voila quelques pistes
__________________
M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 01h20   #3
Dr.Who
Membre Expert
 
Avatar de Dr.Who
 
Inscription : septembre 2009
Messages : 980
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : septembre 2009
Messages : 980
Points : 1 175
Points : 1 175
pourquoi ne gère tu pas une Liste chainée double sens :

Code :
1
2
3
4
5
PLCItem = ^TLCItem;
TLCItem = record
  data: pointer;
  previous, next: PLCItem;
end;
previous = nil = c'est le premier item
next = nil = c'est le dernier item

parcourir dans le bon sens :
Code :
1
2
3
4
5
6
7
 
ptr := item;
while ptr^.next <> nil do
begin
  ptr^.data^ ... quelque chose
  ptr := ptr^.next;
end;
parcourir dans le sens inverse

Code :
1
2
3
4
5
6
7
 
ptr := item;
while ptr^.previous <> nil do
begin
  ptr^.data^ ... quelque chose
  ptr := ptr^.previous;
end;
compter les items
Code :
1
2
3
4
5
6
7
while ptr^.previous <> nil do
  ptr := ptr^.previous;
while ptr^.next <> nil do
begin
  inc(counter);
  ptr := ptr^.next;
end;


tu peux aussi regarde ma vieille source dans ce Zip (l'unité ChainList.pas)
Fichiers attachés
Type de fichier : zip delphifr_CHAINLISTS-LISTE-CHAINEE___Page.zip (13,0 Ko, 7 affichages)
__________________
[ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
Ma messagerie n'est pas la succursale du forum... merci!
Dr.Who est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h54.


 
 
 
 
Partenaires

Hébergement Web