/* Esta clase contiene un nodo, y una clase en C++, que sirve para trabajar con una lista circular, contiene los métodos 'buscar', 'eliminar', 'imprimir', 'insertar_final', 'insertar_comienzo', su destructor y constructor */
struct ndcr { int data; ndcr *dire; }; typedef ndcr *pn; class lstcir { private: pn one; public: lstcir(); ~lstcir(); void insertar_comienzo(int h1); void insertar_final(int h1); void imprimir(); void eliminar(int h1); pn buscar(int h1); pn buscar_anterior(int h1); }; lstcir::lstcir() { one=NULL; } lstcir::~lstcir() { pn k1,k2; if(one!=NULL) { k1=(*one).dire; k2=one; delete k2; while(k1!=one) { k2=k1; k1=(*k1).dire; delete k2; } one=NULL; } } void lstcir::insertar_comienzo(int h1) { pn k1,k2; k1=new ndcr; (*k1).data=h1; if(one==NULL) { one=k1; (*k1).dire=one; } else { k2=(*one).dire; while((*k2).dire!=one) k2=(*k2).dire; (*k2).dire=k1; (*k1).dire=one; one=k1; } } void lstcir::insertar_final(int h1) { pn k1,k2; k1=new ndcr; (*k1).data=h1; if(one==NULL) one=k1; else { k2=(*one).dire; while((*k2).dire!=one) k2=(*k2).dire; (*k2).dire=k1; } (*k1).dire=one; } void lstcir::imprimir() { pn k1; cout<<endl; if(one==NULL) cout<<"Esta lista esta vacia"<<endl; else { k1=one; cout<<(*k1).data<<" -> "; k1=(*k1).dire; while(k1!=one) { cout<<(*k1).data<<" -> "; k1=(*k1).dire; } } cout<<endl; } void lstcir::eliminar(int h1) { pn k1,k2; if(one!=NULL) { k1=one; if((*one).data==h1) { if(one==(*one).dire) { delete one; one=NULL; } else { one=(*one).dire; k2=one; while((*k2).dire!=k1) k2=(*k2).dire; (*k2).dire=one; delete k1; } } else { k2=one; while((*k1).data!=h1 && (*k1).dire!=one) { k2=k1; k1=(*k1).dire; } if((*k1).data==h1) { (*k2).dire=(*k1).dire; delete k1; } } } } pn lstcir::buscar(int h1) { pn k; if(one!=NULL) { k=one; while((*k).dire!=one && (*k).data!=h1) k=(*k).dire; if((*k).data==h1) return k; else return NULL; } else return NULL; } pn lstcir::buscar_anterior(int h1) { pn k,l; k=one; l=NULL; while((*k).data!=h1) { l=k; k=(*k).dire; } return l; } |