He creado este programa que es un Árbol de Expresión, y pues bueno, lee la expresión infija, luego la guarda en el árbol, luego realizando un recorrido en orden muestra el resultado de la expresión guardada. Pero mi problema es de que este programa lo codifiqué en Ubuntu, y ahi me corre bien luego de compilado, pero luego al probarlo en Windows, el programa me compila bien y todo, pero me muestra unos códigos extraños y además hace que la respuesta de la expresión sea errónea.
Aquí les muestro como se ve en Ubuntu:
Aquí les muestro lo que me saca en Windows:
Espero me puedan ayudar ya que es un royecto que me puede salvar la vida :S
Acá queda el código y gracias de antemano.
PD: En Ubuntu el IDE que usé para programar fue el Code::Blocks, el mismo utilicé en Windows para compilar el código.
Código
/*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(){ Arbol raiz=NULL; ++i; } preOrden(raiz); InOrden(raiz); postOrden(raiz); resul=evaluar(raiz); return 0; //Fin del módulo principal. } void preOrden(Arbol a){ if(a!=NULL){ preOrden(a->izquierdo); preOrden(a->derecho); } } void postOrden(Arbol a){ if(a!=NULL){ postOrden(a->izquierdo); postOrden(a->derecho); } } void InOrden(Arbol a){ if(a!=NULL){ InOrden(a->izquierdo); 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 '^': break; case '/': if(y!=0) res=x/y; else break; } return res; } //Inserción para Árbol de Expresión. void insExp(Arbol *a, tipoDato dato){ if(*a==NULL){ if(*a!=NULL){ if(dato!='('){ (*a)->dato=dato; } (*a)->izquierdo=(*a)->derecho=NULL; } } 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; } } } } }