Blocage Arbre binaire - Lexique [Résolu]

Messages postés
3
Date d'inscription
jeudi 14 juin 2007
Statut
Membre
Dernière intervention
6 mai 2011
- - Dernière réponse : 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
}
}
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
3
Merci
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 ) ;


@++;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 194 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Lucky92
Messages postés
3
Date d'inscription
jeudi 14 juin 2007
Statut
Membre
Dernière intervention
6 mai 2011
0
Merci
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
}
}
Commenter la réponse de cs_cedricg92
Messages postés
3
Date d'inscription
jeudi 14 juin 2007
Statut
Membre
Dernière intervention
6 mai 2011
0
Merci
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);	
}
}
Commenter la réponse de cs_cedricg92