arbre n-aire, probleme de code

arbre n-aire, probleme de code - Delphi/Pascal - Programmation

Marsh Posté le 11-01-2009 à 21:52:09    

bonjour à tous,
j'aurais besoin d'aide pour creer un arbre n-aire afin d'implementer un dictionnaire de mot car malheureusement,  mon code ne fonctionne pas à l'execution .
J'apprécierai un peu d'aide afin de pouvoir corriger cette erreur  
Je vous remercie d'avance en vous souhaitant un bon moment dans l'attente de vos réponses.
 
 
 
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;
type
 
        tree = ^Noeud;
        Noeud = record
                Fils    : array['A'..'Z'] of tree;  //liste de fils
                 
                Lettre  : char ;       // lettre contenue dans ce noeud de l'arbre
                Entier  : boolean;     //flag indiquant si le mot est entier
                end; { Noeud }
 
 
 
var
  Form1: TForm1;
  arbre,tete,courant:tree;
 
 
implementation
 
{$R *.dfm}
procedure createtree(a:tree);   //construit les feuilles de l'arbre
var c : char ;
 
begin
new(a);
for c:='A' to 'Z' do
a^.Fils[c]:=nil ;
a^.Lettre:=#0 ;
a^.Entier:=false ;
end ;
 
procedure createarbre(var tete : tree) ;
begin
tete:=nil;
end ;
 
 
procedure rajouter_mot(LeMot : string) ;
var lettre : char ;
var temp : tree;
begin
if LeMot='' then
   begin
   courant^.Entier:=true;
   exit ;
   end;
lettre:=LeMot[1] ;
 
if courant^.fils[lettre]<>nil then  // si la lettre existe déjà
   courant:=courant^.fils[lettre]   // alors on se positionne sur la lettre suivante
else  // sinon il faut créer cette lettre dans l'arbre
   begin
   createtree(courant^.fils[lettre]) ;
   courant:=courant^.fils[lettre] ;
   courant^.lettre:=lettre ;  // la lettre est maintenant dans l'arbre
   end ;
delete(LeMot,1,1) ;  // on efface la lettre du mot puisqu'elle est déjà dans l'arbre
rajouter_mot(LeMot) ; // et on rajoute le reste
 
end ;
 
 
 
procedure chargerarbre(NomFic : string) ;
var   s,chemin : string ;
       f : textfile ;
begin
// chargement du dico
chemin:=ExtractFilePath(Application.ExeName); {le chemin de l'appli, AVEC l'antislash final }
assignFile(f,chemin+nomFic) ;
reset(f) ;
repeat
    readln(f,s) ;
    courant:=tete ;  // on se positionne en tête de l'arbre
    rajouter_mot(s) ;  // et on rajoute le mot
until eof(f) ;
closeFile(f) ;
end ;
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
createarbre(arbre);
chargerarbre('dico1.txt') ;
 
end;
 
end.

Reply

Marsh Posté le 11-01-2009 à 21:52:09   

Reply

Marsh Posté le 12-01-2009 à 14:44:16    

la première fois où tu passes dans rajouter_mot(), courant vaut nil => crash.
Tu dois faire un createtree sur ton noeud courant avant (du coup, ca soulève le nommage doteux de tes fonctions ... createtree et createarbre n'ont pas du tout le même effet)
 
autre point grave : ta procédure createtree prend un paramètre par valeur, et donc elle n'a pas le comportement que tu attends d'elle !
 
ensuite, en vrac :
* j'imagine qu'il y a une balise de code pour reconnaître la pascal aussi sur ce brillant forum, encadre au moins ton code dans des balises [ code ] en attendant
* les variable globales, c'est le mal ...
* ta boucle d'initialisation n'a pas besoin d'initialiser 26 fois les membres lettre et entier de ton noeud adns ta fonction createtree


---------------
last.fm
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed