Bonjour,
j'aurais besoin d'aide pour le problème suivant.
Je dois créer une fonction qui lit une chaine de caractère et construit autant d'arbre que possible.
Par exemple :
si la chaine que j'entre est: + 1 2 - * 3 7 x
la fonction doit me créer 2 arbres: + 1 2 et - * 3 7 x.
J'ai crée la fonction que voici qui me permet de créer un arbre mais comment faire pour en créer plusieurs?
Merci
Voici le code:
[cpp]
enum Type {Operateur, Constante, Variable};
union Info
{
double cte;
char *nom;
char op;
};
struct noeud{
enum Type type;
union Info info;
struct noeud *gauche;
struct noeud *droit;
};
typedef struct noeud Noeud;
typedef struct noeud * Expression;
Expression AnalyseExpression(char **ligne)
{
Expression e;
char c;
char *place;
int cnt;
while(**ligne == ' ') (*ligne)++;
/* on est en fin de chaine */
if(**ligne == '\0')
{
fprintf(stderr,"erreur : il doit manquer des operandes\n");
return NULL;
}
e = (Expression)malloc(sizeof(Noeud));
if(e == NULL) return e;
/* c'est un chiffre */
if(isdigit(**ligne))
{
e->type = Constante;
sscanf(*ligne,"%lf ",&(e->info.cte));
while(isdigit(**ligne) || **ligne == '.') (*ligne)++;
}
else
{
/* c'est une lettre */
if(isalpha(**ligne))
{
/* Calcule de la taille du nom de la variable */
cnt = 0;
place = *ligne;
while( (*place != '\0') && (*place != ' ') )
{
/* compter le nombre de caractere de cette variable */
cnt++;
place++;
}
e->type = Variable;
e->info.nom = (char *) malloc(cnt*sizeof(char));
sscanf(*ligne,"%s ",e->info.nom);
/* while(isalpha(**ligne)) (*ligne)++; */
}
else
{
/* le caractere est un operateur */
c=*((*ligne)++);
if(c == '+' || c == '-' || c == '*' || c == '/')
{
e->type = Operateur;
e->info.op = c;
e->gauche = AnalyseExpression(ligne);
e->droit = AnalyseExpression(ligne);
}
else if(c == '@' || c == '~')
{
e->type = Operateur;
e->info.op = c;
e->gauche = AnalyseExpression(ligne);
e->droit = NULL;
}
else printf("Erreur,'%c' n'est pas un operateur prevu\n",c);
}
}
return e;
}[/cpp]
j'aurais besoin d'aide pour le problème suivant.
Je dois créer une fonction qui lit une chaine de caractère et construit autant d'arbre que possible.
Par exemple :
si la chaine que j'entre est: + 1 2 - * 3 7 x
la fonction doit me créer 2 arbres: + 1 2 et - * 3 7 x.
J'ai crée la fonction que voici qui me permet de créer un arbre mais comment faire pour en créer plusieurs?
Merci
Voici le code:
[cpp]
enum Type {Operateur, Constante, Variable};
union Info
{
double cte;
char *nom;
char op;
};
struct noeud{
enum Type type;
union Info info;
struct noeud *gauche;
struct noeud *droit;
};
typedef struct noeud Noeud;
typedef struct noeud * Expression;
Expression AnalyseExpression(char **ligne)
{
Expression e;
char c;
char *place;
int cnt;
while(**ligne == ' ') (*ligne)++;
/* on est en fin de chaine */
if(**ligne == '\0')
{
fprintf(stderr,"erreur : il doit manquer des operandes\n");
return NULL;
}
e = (Expression)malloc(sizeof(Noeud));
if(e == NULL) return e;
/* c'est un chiffre */
if(isdigit(**ligne))
{
e->type = Constante;
sscanf(*ligne,"%lf ",&(e->info.cte));
while(isdigit(**ligne) || **ligne == '.') (*ligne)++;
}
else
{
/* c'est une lettre */
if(isalpha(**ligne))
{
/* Calcule de la taille du nom de la variable */
cnt = 0;
place = *ligne;
while( (*place != '\0') && (*place != ' ') )
{
/* compter le nombre de caractere de cette variable */
cnt++;
place++;
}
e->type = Variable;
e->info.nom = (char *) malloc(cnt*sizeof(char));
sscanf(*ligne,"%s ",e->info.nom);
/* while(isalpha(**ligne)) (*ligne)++; */
}
else
{
/* le caractere est un operateur */
c=*((*ligne)++);
if(c == '+' || c == '-' || c == '*' || c == '/')
{
e->type = Operateur;
e->info.op = c;
e->gauche = AnalyseExpression(ligne);
e->droit = AnalyseExpression(ligne);
}
else if(c == '@' || c == '~')
{
e->type = Operateur;
e->info.op = c;
e->gauche = AnalyseExpression(ligne);
e->droit = NULL;
}
else printf("Erreur,'%c' n'est pas un operateur prevu\n",c);
}
}
return e;
}[/cpp]