string recursivo(string pal,Pila *p,Cola *c, int i )
{
if((!p->pilavacia() )|| i<pal.length() )
{
if((pal[i]!=' ') && (pal[i]!=',') && (pal[i]!='.'))
{
if(p->tope()==c->tope())
pal[i]='-';
p->desapilar();
c->desencolar();
}
recursivo(pal,p,c,++i);
}
else
{
return pal;
}
el problema se presenta cunado retorno "pal", me da error en ejecucion... antes la funcion "recursivo" era void y dentro del "else" habia un cout, y mostraba "pal", asi funcionaba muy bien, pero necestio que retorne el string... como antes de moficiar eso funcionaba a la perfeccion, puedo suponer que error esta dentro de la funcion anterior, especificamente cunado retorno "pal"
alguien sabe porque es el error en ejecucion?...
El programa entero esta aca:
Código:
#include <cstdlib> #include <iostream> #include <sstream> using namespace std; void iterativa(string); //string recursivo(string,Pila *,Cola * ); typedef int tipolista; class Nodo{ protected: tipolista dato; Nodo *next; public: Nodo() {next=NULL;}; Nodo(tipolista a) {dato=a; next=NULL;}; void set_dato(tipolista a) {dato=a; }; void set_next(Nodo *n) {next=n; }; tipolista get_dato() {return dato; }; Nodo *get_next() {return next; }; bool es_vacio() {return next==NULL;}; }; class Lista{ protected: Nodo *czo; public: Lista() {czo=new Nodo();}; Lista(Nodo *n) {czo=n;}; void del(void); void add(tipolista d); bool esvacia(void); tipolista cabeza(void); Lista *resto(void); string toPrint(tipolista p); Nodo *get_czo(void){return czo;} }; void Lista::del(void) { Nodo *aux; aux=czo; czo=czo->get_next(); delete aux; } void Lista::add(tipolista d) { Nodo *nuevo=new Nodo(d); nuevo->set_next(czo); czo=nuevo; } bool Lista::esvacia(void) { return czo->es_vacio(); } tipolista Lista::cabeza(void) { if(esvacia()){ cout<<" Error, Cabeza de lista vacia"; return -1; } return czo->get_dato(); } Lista *Lista::resto(void) { Lista *l=new Lista(czo->get_next()); return (l); } string Lista::toPrint(tipolista p) { if (this->esvacia()) { return ""; } else { std::ostringstream stm; stm << this->cabeza()<<"-"<< this->resto()->toPrint(p) << endl; return stm.str(); } } //------------------------------------------------------------------------ class Cola{ private: Lista *l; Nodo *czoq; void update_start(Lista *l,Nodo *p); void do_desencolar(Nodo *p,Nodo *s); public: Cola(void){l=new Lista();update_start(l,NULL);}; ~Cola(void) {delete(l);}; int tope(); int colavacia() { return l->esvacia();}; void encolar(int a) ; void desencolar(); }; int Cola::tope() { if (colavacia()){ cout<<"Error: Cola vacia"<<endl; return -1; } else return czoq->get_dato(); } void Cola::encolar(int a) { l->add(a); if (czoq==NULL) { update_start(l,czoq); } } void Cola::desencolar() { if (colavacia()) cout<<"Error: Cola vacia"<<endl; else { do_desencolar(l->get_czo(),NULL); update_start(l,NULL); } } void Cola::do_desencolar(Nodo *p,Nodo *s){ if (p->get_next()==NULL) { if (s!=NULL) { s->set_next(NULL); } delete(p); }else { this->do_desencolar(p->get_next(),p); } } void Cola::update_start(Lista *l,Nodo *p){ if (l->esvacia()) { czoq=p; }else { this->update_start(l->resto(),l->get_czo()); } } //----------------------------------------------------------- class Pila:public Lista{ public: Pila(){Lista();}; void apilar(tipolista x){add(x);}; tipolista tope(void){return cabeza();}; void desapilar(void){del();}; bool pilavacia(){return esvacia();}; }; //----------------------------------------------------------------- void iterativa(string pal) { Cola *l=new Cola(); Pila *p=new Pila(); for(int i=0; i<pal.length();i++) // LLena la cola y la pila { if((pal[i]!=' ') && (pal[i]!=',') && (pal[i]!='.')) { p->apilar(pal[i]); l->encolar(pal[i]); } } for(int i=0; i<pal.length() ;i++) // Compara los datos de la pila con los de las cola, y arma el nuevo string { if((pal[i]!=' ') && (pal[i]!=',') && (pal[i]!='.')) { if(p->tope()==l->tope()) pal[i]='-'; p->desapilar(); l->desencolar(); } } cout<<endl<<"El palindromo por ITERATIVIDAD ES: " << pal << endl; } string recursivo(string,Pila *,Cola *,int ); //-------------------------------------------------------------------- string recursivo(string pal,Pila *p,Cola *c, int i ) { if((!p->pilavacia() )|| i<pal.length() ) { if((pal[i]!=' ') && (pal[i]!=',') && (pal[i]!='.')) { if(p->tope()==c->tope()) pal[i]='-'; p->desapilar(); c->desencolar(); } recursivo(pal,p,c,++i); } else { return pal; } } //--------------------------------------------------------------------- int main() { string palin="neuquen"; Cola *ci=new Cola(); Pila *pi=new Pila(); string NUEVO; //cout<<endl<<"Ingrese cadena= "; cin>>palin; for(int i=0; i<palin.length();i++) { if((palin[i]!=' ') && (palin[i]!=',') && (palin[i]!='.')) { pi->apilar(palin[i]); ci->encolar(palin[i]); } } cout<<"LA FRASE = "<<palin<<endl; cout<<endl<<endl<<"//////////////////////////////////////////////////////////"<<endl<<endl; iterativa(palin); cout<<endl<<endl<<"//////////////////////////////////////////////////////////"<<endl<<endl; NUEVO = recursivo(palin,pi,ci,0); cout<<endl<<"El palindromo por RECURSIVIDAD ES: " << NUEVO << endl; cout<<endl<<endl; system("PAUSE"); }
EDITO: ENCONTRE LA SOLUCION, me falto un return antes de llamar de nuevo a la funcion, osea quedaria return recursivo(pal,p,c,++i); ... que manera de perder tiempo con esto jaja