arbre n-aire, probleme de code - Delphi/Pascal - Programmation
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
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.