Muchísimas gracias man, ya me ha funcionado Me habéis salvado la vida.
Gracias!
Gracias!
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes Menú/*El siguiente programa lee una expresión matemática, muestra los diferentes recorridos de la
expresión (EnOrden, PreOrden y PostOrden) y luego evalúa dicha expresión mostrando el resultado final. */
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
typedef char tipoDato;
struct nodo{
tipoDato dato;
struct nodo *izquierdo;
struct nodo *derecho;
};
typedef struct nodo *Arbol;
void insExp(Arbol *a, tipoDato dato);
void InOrden(Arbol a);
void postOrden(Arbol a);
void preOrden(Arbol a);
int evaluar(Arbol a);
int operar(int, int, char);
//Inicio del módulo principal.
int main(){
tipoDato exp[100]; int i=0,resul;
Arbol raiz=NULL;
printf("\nIngrese la expresion: ");
gets(exp);
while(exp[i]){
insExp(&raiz,exp[i]);
++i;
}
printf("\n\nRECORRIDO POSTORDEN:\n");
preOrden(raiz);
printf("\n\nRECORRIDO INORDEN:\n");
InOrden(raiz);
printf("\n\nRECORRIDO POSTORDEN:\n");
postOrden(raiz);
resul=evaluar(raiz);
printf("\n\nRESULTADO DE EXPRESION: %d\n\n",resul);
for(i=0;i<=60;i++) printf("*");
getch();
return 0;
//Fin del módulo principal.
}
void preOrden(Arbol a){
if(a!=NULL){
printf("%c",a->dato);
preOrden(a->izquierdo);
preOrden(a->derecho);
}
}
void postOrden(Arbol a){
if(a!=NULL){
postOrden(a->izquierdo);
postOrden(a->derecho);
printf("%c",a->dato);
}
}
void InOrden(Arbol a){
if(a!=NULL){
InOrden(a->izquierdo);
printf("%c",a->dato);
InOrden(a->derecho);
}
}
int evaluar(Arbol a){
int ope1, ope2;
if(a==NULL) return 0;
else if(a->izquierdo==NULL && a->derecho==NULL) return(a->dato-48);
else{
ope1=evaluar(a->izquierdo);
ope2=evaluar(a->derecho);
return(operar(ope1,ope2,a->dato));
}
}
int operar(int x, int y, char z){
int res;
switch(z){
case '+':
res=x+y;
break;
case '-':
res=x-y;
break;
case '*':
res=x*y;
break;
case '^':
return pow(x,y);
break;
case '/':
if(y!=0)
res=x/y;
else
puts("ERROR! division entre cero");
break;
}
return res;
}
//Inserción para Árbol de Expresión.
void insExp(Arbol *a, tipoDato dato){
if(*a==NULL){
*a=malloc(sizeof(struct nodo));
if(*a!=NULL){
if(dato!='('){
(*a)->dato=dato;
}
(*a)->izquierdo=(*a)->derecho=NULL;
}
else printf("\nNo se pudo asignar memoria...CERRANDO APLICACION\n");
}
else{
if(dato=='('){
if((*a)->izquierdo==NULL)
insExp(&((*a)->izquierdo),dato);
else
insExp(&((*a)->derecho),dato);
}
else if(dato>=48 && dato<=57){
if((*a)->dato=='\0'){
insExp(&((*a)->izquierdo),dato);
}
else
insExp(&((*a)->derecho),dato);
}
if(dato=='*' || dato=='+' || dato=='-' || dato=='/' || dato=='^'){
if((*a)->dato=='\0' && (*a)->derecho==NULL){
if((*a)->izquierdo->dato=='\0')
insExp(&((*a)->izquierdo),dato);
else
(*a)->dato=dato;
}
else{
if((*a)->izquierdo!=NULL && (*a)->derecho!=NULL){
if((*a)->derecho->dato=='\0')
insExp(&((*a)->derecho),dato);
else
(*a)->dato=dato;
}
}
}
}
}