Blocage Arbre binaire - Lexique

Résolu
cs_cedricg92 Messages postés 3 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 6 mai 2011 - 5 mai 2011 à 19:53
cs_cedricg92 Messages postés 3 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 6 mai 2011 - 6 mai 2011 à 13:48
Bonjour,

Je dois faire un programme qui doit être capable de trier un texte dans lexique tel un dictionnaire en comptant les occurrences. Donc pour cela j'ai un programme en C sous Visual 2008, qui est composé de trois fonctions une de décomposition du texte, une autre d'enregistrement du mot dans le lexique et enfin une fonction d'affichage du lexique. Mon problème est que ma fonction d'enregistrement du mot fonctionne mal : elle enregistre bien le premier mot en pas a pas mais enregistre les suivants en écrasant le précédant. Si quelqu'un à le temps et la gentillesse de m'aider, je le remerciais par avance. Merci

/**********************************/
/***************En-tête************/
/**********************************/
#include "stdio.h"
#include "ctype.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h"

struct Arbre
{
char *Mot;
int NbOcc;
Arbre* SAG;
Arbre* SAD;
};

/**********Prototype****************/

void Split(char* Text, Arbre* &Lex);//Découpage du texte
void InsertWord(char *Mot, Arbre* &Lex);//Enregistrement du texte
void DrawLexique(Arbre* &Lex);//Affichage du texte

/**********************************/
/********Programme principale******/
/**********************************/
void main()
{
Arbre *Lexique = NULL;//Variable du lexique
Split("Ceci est un essai.",Lexique);//Appel de la fonction de découpage du texte
DrawLexique(Lexique);//Affichage du texte
getch();//Attente de l'utilisateur
}


/**********************************/
/*************Fonction*************/
/**********************************/

//Découpage du texte
void Split(char* Text, Arbre* &Lex)
{
char *P = Text;//Création d'une variable locale
int i=0;
char temp[32];//Buffer
while(true)//Boucle infinie
{
for(;!isalpha(P[i]);i++)//Boucle si il s'agit d'un caractère non alphabétique
if(P[i]==NULL)//Si c'est la fin de la chaine
return;//Arrête la fonction
for(int x=0; x<32;x++)//Boucle pour initialiser le buffer
temp[x] = NULL;
for(int x=0;isalpha(P[i]);i++)//Boucle si il s'agit d'un caractère alphabétique
{
temp[x]=P[i];//Enregistre dans le buffer
x++;
}
InsertWord(temp,Lex);//Enregistre dans le lexique
}
}

//Enregistrement du texte
void InsertWord(char *Mot, Arbre* &Lex)
{
if(!Lex)//Si le lexique n'existe pas
{
Arbre* nouveau = new Arbre;//Réserve de la mémoire pour la structure du mot
nouveau->Mot = new char[strlen(Mot)+1];//Réserve de la mémoire pour le mot
nouveau->Mot = Mot;//Enregustre le mot
nouveau->NbOcc = 1;//Initialise l'occurence
nouveau->SAD = NULL;//Initialise la branche de droite
nouveau->SAG = NULL;//Initialise la branche de gauche
Lex = nouveau;
return;//Sort de la fonction
}
if(Lex)//Si le lexique existe
{
if(strcmp(Mot,Lex->Mot)==0)//Si le mot existe
{
Lex->NbOcc++;//Incrémente l'occurence
return;//Sort de la fonction
}
if(strcmp(Mot,Lex->Mot)<0)//Si le mot se situe avant dans le dictionnaire par rapport au mot déjà enregistré
{
InsertWord(Mot,Lex->SAG);//Enregistre avant le mot
return;//Sort de la fonction
}
if(strcmp(Mot,Lex->Mot)>0)//Si le mot se situe après dans le dictionnaire par rapport au mot déjà enregistré
{
InsertWord(Mot,Lex->SAD);//Enregistre après le mot
return;//Sort de la fonction
}
}
}

//Affichage du texte
void DrawLexique(Arbre* &Lex)
{
if(Lex)//Si le lexique existe
{
printf("%d %s\n",Lex->NbOcc,Lex->Mot);//Affiche le premier enregistre
}
}

3 réponses

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
5 mai 2011 à 21:20
Salut,

Ceci est une erreur classique :

nouveau->Mot = new char[strlen(Mot)+1];//Réserve de la mémoire pour le mot
nouveau->Mot = Mot;//Enregustre le mot


La seconde ligne ne copie pas une chaîne, mais copie un pointeur ; remplace la seconde ligne par :

strcpy( Mot , nouveau->Mot ) ;


@++;
3
cs_cedricg92 Messages postés 3 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 6 mai 2011
5 mai 2011 à 21:39
Ok merci c'était ça Merci!!!

/**********************************/
/***************En-tête************/
/**********************************/
#include "stdio.h"
#include "ctype.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h"

struct Arbre
{
char *Mot;
int NbOcc;
Arbre* SAG;
Arbre* SAD;
};

/**********Prototype****************/

void Split(char* Text, Arbre* &Lex);//Découpage du texte
void InsertWord(char *Mot, Arbre* &Lex);//Enregistrement du texte
void DrawLexique(Arbre* &Lex);//Affichage du texte

/**********************************/
/********Programme principale******/
/**********************************/
void main()
{
Arbre *Lexique = NULL;//Variable du lexique
Split("Ceci est un essai.",Lexique);//Appel de la fonction de découpage du texte
DrawLexique(Lexique);//Affichage du texte
getch();//Attente de l'utilisateur
}


/**********************************/
/*************Fonction*************/
/**********************************/

//Découpage du texte
void Split(char* Text, Arbre* &Lex)
{
char *P = Text;//Création d'une variable locale
int i=0;
char temp[32];//Buffer
while(true)//Boucle infinie
{
for(;!isalpha(P[i]);i++)//Boucle si il s'agit d'un caractère non alphabétique
if(P[i]==NULL)//Si c'est la fin de la chaine
return;//Arrête la fonction
for(int x=0; x<32;x++)//Boucle pour initialiser le buffer
temp[x] = NULL;
for(int x=0;isalpha(P[i]);i++)//Boucle si il s'agit d'un caractère alphabétique
{
temp[x]=P[i];//Enregistre dans le buffer
x++;
}
InsertWord(temp,Lex);//Enregistre dans le lexique
}
}

//Enregistrement du texte
void InsertWord(char *Mot, Arbre* &Lex)
{
if(!Lex)//Si le lexique n'existe pas
{
Arbre* nouveau = new Arbre;//Réserve de la mémoire pour la structure du mot
nouveau->Mot = new char[strlen(Mot)+1];//Réserve de la mémoire pour le mot
strcpy(nouveau->Mot,Mot);//Enregustre le mot
nouveau->NbOcc = 1;//Initialise l'occurence
nouveau->SAD = NULL;//Initialise la branche de droite
nouveau->SAG = NULL;//Initialise la branche de gauche
Lex = nouveau;
return;//Sort de la fonction
}
if(Lex)//Si le lexique existe
{
if(strcmp(Mot,Lex->Mot)==0)//Si le mot existe
{
Lex->NbOcc++;//Incrémente l'occurence
return;//Sort de la fonction
}
if(strcmp(Mot,Lex->Mot)<0)//Si le mot se situe avant dans le dictionnaire par rapport au mot déjà enregistré
{
InsertWord(Mot,Lex->SAG);//Enregistre avant le mot
return;//Sort de la fonction
}
if(strcmp(Mot,Lex->Mot)>0)//Si le mot se situe après dans le dictionnaire par rapport au mot déjà enregistré
{
InsertWord(Mot,Lex->SAD);//Enregistre après le mot
return;//Sort de la fonction
}
}
}

//Affichage du texte
void DrawLexique(Arbre* &Lex)
{
if(Lex)//Si le lexique existe
{
printf("%d %s\n",Lex->NbOcc,Lex->Mot);//Affiche le premier enregistre
}
}
0
cs_cedricg92 Messages postés 3 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 6 mai 2011
6 mai 2011 à 13:48
Voila le code est fini, cela est un vrai lexique.

/**********************************/
/***************En-tête************/
/**********************************/
#include "stdio.h"
#include "ctype.h"
#include "conio.h"
#include "stdlib.h"
#include "string.h"
#include "texte.h"

struct Arbre
{
char *Mot;
int NbOcc;
Arbre* SAG;
Arbre* SAD;
Arbre* PRE;
};
/*************Prototype*************/

void Split(char* Text, Arbre* &Lex);//Découpage du texte
void InsertWord(char *Mot, Arbre* &Lex);//Enregistrement du texte
void DrawLexique(Arbre* &Lex);//Affichage du texte

/**********************************/
/********Programme principale******/
/**********************************/
void main()
{
printf("%s",Texte2);
Arbre *Lexique = NULL;//Variable du lexique
Split(Texte1,Lexique);//Appel de la fonction de découpage du texte
DrawLexique(Lexique);//Affichage du texte
getch();//Attente de l'utilisateur
}


/**********************************/
/*************Fonction*************/
/**********************************/

//Découpage du texte
void Split(char* Text, Arbre* &Lex)
{
char *P = Text;//Création d'une variable locale
int i=0;
char temp[32];//Buffer
while(true)//Boucle infinie
{
for(;!isalpha(P[i]);i++)//Boucle si il s'agit d'un caractère non alphabétique
if(P[i]==NULL)//Si c'est la fin de la chaine
return;//Arrête la fonction
for(int x=0; x<32;x++)//Boucle pour initialiser le buffer
temp[x] = NULL;
for(int x=0;isalpha(P[i]);i++)//Boucle si il s'agit d'un caractère alphabétique
{
if(P[i]<=90)
temp[x]=P[i]+32;
else
temp[x]=P[i];//Enregistre dans le buffer
x++;
}
InsertWord(temp,Lex);//Enregistre dans le lexique
}
}

//Enregistrement du texte
void InsertWord(char *Mot, Arbre* &Lex)
{
if(!Lex)//Si le lexique n'existe pas
{
Arbre* nouveau = new Arbre;//Réserve de la mémoire pour la structure du mot
nouveau->Mot = new char[strlen(Mot)+1];//Réserve de la mémoire pour le mot
strcpy(nouveau->Mot,Mot);//Enregustre le mot
nouveau->NbOcc = 1;//Initialise l'occurence
nouveau->SAD = NULL;//Initialise la branche de droite
nouveau->SAG = NULL;//Initialise la branche de gauche
Lex = nouveau;
return;//Sort de la fonction
}
if(Lex)//Si le lexique existe
{
if(strcmp(Mot,Lex->Mot)==0)//Si le mot existe
Lex->NbOcc++;//Incrémente l'occurence
if(strcmp(Mot,Lex->Mot)<0)//Si le mot se situe avant dans le dictionnaire par rapport au mot déjà enregistré
InsertWord(Mot,Lex->SAG);//Enregistre avant le mot
if(strcmp(Mot,Lex->Mot)>0)//Si le mot se situe après dans le dictionnaire par rapport au mot déjà enregistré
InsertWord(Mot,Lex->SAD);//Enregistre après le mot
}
}

//Affichage du texte
void DrawLexique(Arbre* &Lex)
{
Arbre* Temp = new Arbre;
Temp = Lex;
if(Lex)//Si le lexique existe
{
if(Temp->SAG)
DrawLexique(Temp->SAG);
printf("\t\t\t\t\t\t\t\t\t%d\t%s\n",Temp->NbOcc,Temp->Mot);
if(Temp->SAD)
DrawLexique(Temp->SAD);	
}
}
0
Rejoignez-nous