Taille maxiamle d'une liste chainée!!

Signaler
Messages postés
46
Date d'inscription
mardi 2 juin 2009
Statut
Membre
Dernière intervention
7 octobre 2009
-
Messages postés
46
Date d'inscription
mardi 2 juin 2009
Statut
Membre
Dernière intervention
7 octobre 2009
-
Bonjour à tous,
Voilà j'ai crée une application où je crée une liste chainée, et chaque fois je modifie la taille de cette liste chainée, l'application marche trés bien mais dès que j'essaye de créer une liste chainée de plus de 300 éléments, l'application bloque.

Donc je voudrais savoir s'il y a une limitation de la taille des listes chainées, (sachant que je programme en DELPHI 5)

Merci de me répondre.

8 réponses

Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
Théoriquement, une liste chaînée n'est limitée que par la mémoire de l'ordinateur (puisque les éléments de la liste peuvent être placés potentiellement partout dans la mémoire). As-tu réessayé plusieurs fois pour voir si ça plante toujours ? Parfois, il se peut que quelque chose ait interféré avec ta liste (en écrasant un pointeur par exemple, et donc la liste "déraille").

Cordialement, Bacterius !
Messages postés
46
Date d'inscription
mardi 2 juin 2009
Statut
Membre
Dernière intervention
7 octobre 2009

Merci bactérius de ta réponse;
en fait ce que je voulais faire au départ c'est créer une liste chainée de 2000 éléments biensur, il a bloqué, donc j'ai commencé à agrandir ma liste petit à petit, et bon pour etre plus exatce jusqu'à une liste chainée de 295 éléments ça compilé parfaitement et meme rapidement, au delà de ça, ben ça bloquait!

Merci de me répondre.
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
Tu veux dire que ça ne compilait pas ?

Cordialement, Bacterius !
Messages postés
46
Date d'inscription
mardi 2 juin 2009
Statut
Membre
Dernière intervention
7 octobre 2009

En fait ça n'affiche pas de message d'erreur, j'ai l'impression que comme la taille est trop grande ça lui prends du temps, mais j'ai beau attendre rien ne se passe alors j'arrete l'exécution; voilà!
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
Envoie le code pour voir ?

Cordialement, Bacterius !
Messages postés
46
Date d'inscription
mardi 2 juin 2009
Statut
Membre
Dernière intervention
7 octobre 2009

ok je vais envoyer le code mais, c'est bien complexe et et ça nécessitera beaucoup d'explications! Comment j'envois le code je le copie colle simplement ici?

MERCI.
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
Oui, et utilise la balise Delphi, plus facile à lire.

Cordialement, Bacterius !
Messages postés
46
Date d'inscription
mardi 2 juin 2009
Statut
Membre
Dernière intervention
7 octobre 2009

Type
Adresse=record
URL:String;
Num:Integer;
end;
TableauURL=Array of Adresse;


PListe2=^TListe2;
TListe2=record
Elem2:integer;
suiv : PListe2;
end;
PListe=^TListe;
TListe=record
Elem:integer;
Suiv1: PListe2;
Suiv2:PListe;
end;


//Cette première procedure permet de récupére un fichier texte qui sera afficher dans un composante ListBox, et ce que contient ce fichier text ce sont enfait des URLs:

procedure TForm1.btnloadfileClick(Sender: TObject);
begin
if (OpenDialog.Execute) then
ListBox.Items.LoadFromFile(OpenDialog.FileName);
end;


//Cette deuxieme procedure permet de classer ces URLs c'est à dire de leurs attribuer un numéro à chacun, biensur en évitant de réattribuer un autre chiffre si on rerencontre un URL déja vu:

procedure TForm1.btnparseClick(Sender: TObject);
var
i,
k,
l,
R,
Position,
Position2,
Position3,
Limite: Integer;
TURL : String;
NumURL:integer;
begin
Setlength(TabURL,100000);
NumURL:=0; // c le numéro de l'url de base
k:=1;

//traitement des URLs de base
for I:=0 to ListBox.Items.Count-1 do
begin

Position:=Pos('URL de base',ListBox.Items[i]); //récupération des url de bases
if(Position<>0) then
begin
Inc(NumURL);
//on récupére ici l'url de base
// c'est ici que tu fais l'insertion dans la liste chainée
TURL:=Copy(ListBox.Items[i],Position+17,Length(ListBox.Items[i]));
TabURL[k].Num:=(NumURL);
TabURL[k].URL:=TURL;
{ShowMessage('N°'+InttoStr(TabURL[k].Num)+TabURL[k].URL);}
k:=k+1;
end;

end;
//Traitement des sous-URLs
Limite:=k;
For l:=0 to ListBox.Items.Count-1 do
Begin
Position3:=Pos('URL de Base',ListBox.Items[l]);
Position2:=Pos(' h',ListBox.Items[l]);
If((Position3=0) and (Position2<>0))
then
Begin
TURL:=Copy(ListBox.Items[l],Position2,length(ListBox.Items[l]));
R:=Retrouve(TURL,TabURL);
If R=0 then
Begin
Inc(NumURL);
TabURL[k].Num:=NumURL;
TabURL[k].URL:=TURL;
{ShowMessage('N°'+InttoStr(TabURL[k].Num)+TabURL[k].URL);}
Limite:=Limite+1;
k:=k+1;
end;
end;
end;
Setlength(TabURL,Limite);
ShowMessage(IntToStr(Length(TabURL)));


end;

//C'est le fameux boutton qui me pose problème, c'est le boutton qui permet de créer la liste chainée en exploitant: la listBox et les numéros affectés aux URLs, mais il faut savoir que ce n'est pas une liste chainée toute simple, un élément de la liste chainée est un enregistrement qui contient: un integer, un pointeur de type PListe2 et un troisième pointeur de type PListe tu peux voir ça dans la déclaration de type:

procedure TForm1.btnListeClick(Sender: TObject);
Var
TabBase,Repertoire:Array of Integer;
TURL :String;
Position4,Position5,Position6,Position7,Position8,Position9,j,atteint,s,R,tr,i,h:Integer;
Pointeur,Tempo1,Tempo2:PListe;
Pointeur2,Tempo3,Tempo4:PListe2;
Trouv:Boolean;
Begin
New(ListeAdj);
ListeAdj:=Nil;
New(Tempo1);
Tempo1^.Elem:=TabURL[1].Num;
Tempo2:=ListeAdj;
ListeAdj:=Tempo1;
Tempo1^.suiv2:=Tempo2;
{ShowMessage(IntToStr(ListeAdj^.Elem));}
Setlength(TabBase,600);
TabBase[1]:=ListeAdj^.Elem;
New(ListeAdj^.Suiv1);
ListeAdj^.Suiv1:=NIL;
j:=1;
h:=1;
Setlength(Repertoire,600);
Repertoire[1]:=ListeAdj^.Elem;
Position4:=Pos('URL de base',ListBox.Items[j]);
While((j<=ListBox.Items.Count-1) and (Position4=0)) do
Begin
Position5:=Pos(' h',ListBox.Items[j]);
TURL:=Copy(ListBox.Items[j],Position5,Length(ListBox.Items[j]));
R:=Retrouve(TURL,TabURL);
Trouv:=False;
tr:=1;
While ((tr<=h) and (Trouv=false)) do
Begin
If Repertoire[tr]=TabURL[R].Num then trouv:=true
else tr:=tr+1;
end;

If (Trouv=False) then
Begin
h:=h+1;
Repertoire[h]:=TabURL[R].Num;
end;

If ((R<>0) and(Trouv=False))then
Begin
New(Tempo3);
Tempo3^.Elem2:=TabURL[R].Num;
Tempo4:=ListeAdj^.Suiv1;
ListeAdj^.Suiv1:=Tempo3;
Tempo3^.Suiv:=Tempo4;
{ShowMessage(IntToStr(ListeAdj^.Suiv1^.Elem2));}
end;


j:=j+1;
Position4:=Pos('URL de base',ListBox.Items[j]);
end;
{ShowMessage(IntToStr(Longueur(ListeAdj)));}

atteint:=j;
i:=2;

Begin
While(atteint<=ListBox.Items.Count-1) do
Begin
Position6:=Pos('URL de base',ListBox.Items[atteint]);
If ((Position6)<>0) then
Begin
New(Tempo1);
TURL:=Copy(ListBox.Items[atteint],(Position6)+17,Length(ListBox.Items[atteint]));
R:=Retrouve(TURL,TabURL);
Tempo1^.Elem:=TabURL[R].Num;
Tempo2:=ListeAdj^.Suiv2;
ListeAdj^.Suiv2:=Tempo1;
Tempo1^.suiv2:=Tempo2;
TabBase[i]:=ListeAdj^.Suiv2^.Elem;
i:=i+1;
{ShowMessage(IntToStr(ListeAdj^.Suiv2^.Elem));}
s:=Atteint+1;
Position7:=Pos(' h',ListBox.Items[s]);
Position6:=Pos('URL de base',ListBox.Items[s]);
ListeAdj^.Suiv2^.Suiv1:=Nil;
If (((Position6)=0)and((Position7)<>0)) then
Begin
Setlength(Repertoire,100);
Repertoire[1]:=ListeAdj^.Suiv2^.Elem;
h:=1;
While (Position7<>0) and (Position6=0)do
Begin
TURL:=Copy(ListBox.Items[s],Position7,Length(ListBox.Items[s]));
R:=Retrouve(TURL,TabURL);
Trouv:=False;
tr:=1;
While ((tr<=h) and (Trouv=false)) do
Begin
If Repertoire[tr]=TabURL[R].Num then trouv:=true
else tr:=tr+1;
end;

If (Trouv=False) then
Begin
h:=h+1;
Repertoire[h]:=TabURL[R].Num;
end;
If ((R<>0) and(Trouv=False))then
Begin
New(Tempo3);
Tempo3^.Elem2:=TabURL[R].Num;
Tempo4:=ListeAdj^.Suiv2^.Suiv1;
ListeAdj^.Suiv2^.Suiv1:=Tempo3;
Tempo3^.Suiv:=Tempo4;
{ShowMessage(IntToStr(ListeAdj^.Suiv1^.Elem2));}
end;
s:=s+1;
Position6:=Pos('URL de base',ListBox.Items[s]);
Position7:=Pos(' h',ListBox.Items[s]);
end;
end;
If (((Position6)=0)and((Position7)=0)) then s:=s+1;
end;
{ShowMessage(IntToStr(Longueur(ListeAdj)));}
Atteint:=s;
end;


//Ajout horizontale des sommets sans successeurs
j:=1;
While(j<=ListBox.Items.Count-1) do
Begin
Position8:=Pos('URL de base',ListBox.Items[j]);
Position9:=Pos(' h',ListBox.Items[j]);
If ((Position8=0) and (Position9<>0)) then
Begin
TURL:=Copy(ListBox.Items[j],Position9,Length(ListBox.Items[j]));
R:=Retrouve(TURL,TabURL);
Trouv:=false;
tr:=1;
While ((tr<=i) and (Trouv=false)) do
Begin
If TabBase[tr]=TabURL[R].Num then trouv:=true
else tr:=tr+1;
end;
If (Trouv=False) then
Begin
New(Tempo1);
New(Tempo1^.Suiv1);
Tempo1^.Elem:=TabURL[R].Num;
Tempo1^.Suiv1:=Nil;
Tempo2:=ListeAdj^.Suiv2;
ListeAdj^.Suiv2:=Tempo1;
Tempo1^.suiv2:=Tempo2;
TabBase[i]:=TabURL[R].Num;
i:=i+1;
end;
end;
j:=j+1;
end;

//Juste pour afficher la liste
Pointeur:=ListeAdj;
While(Pointeur<>Nil) do
Begin
Memo1.Lines.Add(IntToStr(Pointeur^.Elem));
{ShowMessage(IntToStr(Pointeur^.Elem));}
Pointeur2:=Pointeur^.Suiv1;
While (Pointeur2<>Nil) do
Begin
Memo1.Lines.Add(IntToStr((Pointeur2^.Elem2)));
{ShowMessage(IntToStr(Pointeur2^.Elem2));}
Pointeur2:=Pointeur2^.Suiv;
end;
Pointeur:=Pointeur^.Suiv2;
end;
Pointeur:=ListeAdj;
m:=0;
While(Pointeur<>Nil) do
Begin
m:=m+Longueur(Pointeur);
Pointeur:=Pointeur^.Suiv2;
end;
n:=Longueur1(ListeAdj);
end;
end;
Voilà, c'est bien compliqué comme je le disais, si biensur tu as une question je suis là, Merci encore