Hello,
J'ai fait ce code a fin de construire un arbre n-aire dont la racine "NULL" et les noued sont les produits(Riz,pain,....). mais toujour j'ai un problème au niveau du code entre // ============= // .
Si le nud tque N.item=debut existe déjà dans larbre on incrémente le count de ce noeud sinon Créer un nouveau nud N N.count = 1 et Créer le lien de parenté entre le nud N et Tree tel que Tree soit le père de N
count : la fréquence de chaque item (exemple Riz est 4) par rapport aux T[i].
Merci de m'aider a résoudre ce problème sachant que j'ai fait plusieurs code mais toujours j'ai un message "violation d'accès à l'adresse 0045E7E dans le module..»
le code :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
//const taille=5;
type
Noeud=
class
private
Fils : array[1..5] of Noeud; //liste de fils
item :string;
count : integer;
//lien : Noeud;
public
constructor create ;
destructor destroy ;
end; { Noeud }
Arbre =
class
private
tete,courant : noeud ;
public
constructor create ;
destructor destroy ;override ;
procedure insert_Tree(Chaine: string);
procedure buildTree();
end ;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
Tree1 : Arbre;
implementation
{$R *.dfm}
constructor noeud.create ;
var i : integer ;
begin
for i:=0 to 5 do
fils[i]:=nil ;
item:='NULL' ;
count :=0;
//lien:='NULL';
end ;
destructor noeud.destroy ;
var i : integer ;
begin
for i:=0 to 5 do
if fils[i]<>nil then fils[i].destroy ;
inherited destroy ;
end ;
constructor arbre.create ;
begin
tete:=noeud.create ;
courant:=tete ;
end ;
destructor arbre.destroy ;
begin
tete.destroy ;
inherited destroy ;
end ;
procedure arbre.insert_Tree(Chaine: string);
const Delimiteur=',';
var Debut, Fin: string;
k: integer;
begin
// Récupère Début et Fin
k:=Pos(Delimiteur,Chaine);
if k=0 then
begin
Debut:=Chaine; Fin:='';
end
else
begin
Debut:=Copy(Chaine, 1, k-1);
Fin:=Copy(Chaine, k+1, length(Chaine)-k);
end;
//============== Problème a ce niveau =============
if courant.item=Debut then // Si le nud tque N.item=debut existe déjà dans larbre on incrémente le count de ce noeud
begin // Debut = élément a ajouter
inc(courant.count);
courant:=courant.Fils[??]
end
else
begin
courant.fils[??]:=noeud.create ; //nouveau noeud
courant:=courant.fils[??] ;
courant.item:=Debut ;
courant.count:=1;
end ;
//============================================//
// ShowMessage(Debut);
// en s'arrete lorsque la liste est vide
if Fin='' then exit else insert_Tree(Fin);
end;
procedure arbre.buildTree();
const NbElements= 5;
var T: array[1..NbElements] of string;
i: integer;
begin
T[1]:='Riz,Pain,Eau';
T[2]:='Riz,Pain';
T[3]:='Eau,sucre';
T[4]:='Riz,Pain,Sucre';
T[5]:='Riz,Pain,Eau,Sucre';
courant:=tete ;
for i:=1 to NbElements do insert_Tree(T[i]);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Tree1:=arbre.create ;
end;
procedure TForm1.Button1Click(Sender: TObject);
Begin
Tree1.buildTree();
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Tree1.Destroy;
end;
end.
cordialement.