C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) OBJETIVOS Explicar la estructura dinámica lista doblemente enlazadas. Implementar el TAD lista doblemente enlazadas. Utilizar el TAD lista doblemente enlazadas para resolver problemas. 3 Msc. Walter Fernandez Toglio. LISTAS DOBLEMENTE ENLAZADAS 1 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) TEMAS Listas doblemente enlazadas. Operaciones con Listas doblemente enlazadas Resolución de problemas usando listas doblemente enlazadas SOFTWARE NECESARIO Dev-C++ 4.9.9.2 http://sourceforge.net/projects/dev-cpp/files/Binaries/ NetBeans IDE C/C++ http://netbeans.org/features/cpp/ Code::Blocks http://www.codeblocks.org/downloads/26 Eclipse C++ http://www.eclipse.org/downloads/packages/eclipse-ide-ccdevelopers-includes-incubating-components/indigosr1 Visual C++ http://www.microsoft.com/visualstudio/eng/products/visual-studioexpress-products Borland C++ http://edn.embarcadero.com/article/20633 Msc. Walter Fernandez Toglio. 2 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) LISTAS DOBLEMENTE ENLAZADAS ORDENADAS (DE) Cada elemento contiene 2 punteros: hacia atrás y hacia delante en la Lista Las Operaciones son las mismas que para las Simplemente Enlazadas, pero aquí se pueden dar en ambas direcciones. El Borrado supone realizar los enlaces entre el puntero del nodo anterior con siguiente al que se desea eliminar. En una lista doblemente enlazada cada nodo tiene al menos tres campos: Enlace al nodo siguiente. Elemento. El dato de la lista. Enlace al nodo anterior. 1 5 Los algoritmos para las operaciones sobre listas doblemente enlazadas son normalmente más complicados. Pueden ser recorridas fácilmente en ambos sentidos. L Primero nil DATO 1 nil DATO 2 DATO 3 Listas doblemente enlazadas EJEMPLO L Primero nil 5 15 30 50 70 nil Msc. Walter Fernandez Toglio. 3 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) LISTAS DOBLEMENTE ENLAZADAS ORDENADAS: LISTA VACÍA Primero Primero Msc. Walter Fernandez Toglio. 4 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) LISTAS DOBLEMENTE ENLAZADAS ORDENADAS: DECLARACIÓN FORMAL class nodo { public: nodo(int v,nodo *ant=NULL,nodo *sig=NULL) { valor=v; siguiente=sig; anterior=ant; } private: int valor; nodo *anterior; nodo *siguiente; friend class listaDE; }; typedef nodo *pnodo; class listaDE { public: listaDE() { primero=actual=NULL; } ~listaDE(); void Insertar(int v); void Borrar(int v); bool ListaVacia() { return primero==NULL; } void Mostrar(); void Siguiente(); void Primero(); void Ultimo(); bool Actual() { return actual!=NULL; } int ValorActual() { return actual->valor; } private: pnodo primero; pnodo actual; }; Msc. Walter Fernandez Toglio. actual 5 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) LISTAS DOBLEMENTE ENLAZADAS ORDENADAS: INSERCIÓN Parámetros: Lista (L) , elemento (e), posición (p) La posición debe ser válida (1 <= p <= (Long(L) + 1) Considerar: Inserción en primera posición, al final de la lista, en lista vacía Procedimiento: 1. Localizar la posición 2. Crear el nodo con el elemento 3. Actualizar los apuntadores involucrados EJEMPLO Dada la siguiente lista doblemente enlazada, se desea insertar un nodo cuyo valor es Primero 18 L nil 5 15 30 50 70 50 70 nil SOLUCIÓN 1 Localizar la posición del nuevo nodo L ant sig 15 30 primero nil 5 nil 1. Localizar la posición del nuevo nodo sig=primero; while(sig && sig->valor<=v) { ant=sig; sig = sig->siguiente; } Msc. Walter Fernandez Toglio. 6 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) 2. Crear nuevo nodo 2. Crear nuevo 18 nodo new nodo(18, ant, sig); 3. Actualizar apuntadores del nuevo nodo L primero ant sig 15 30 nil 5 50 70 nil 18 3. Actualizar apuntadores del nuevo nodo n== new nodo(18, ant, sig); if (ant) ant->siguiente = n; if(sig) sig->anterior = n; Msc. Walter Fernandez Toglio. 7 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) void listaDE::Insertar(int v) { pnodo ant=NULL, n=NULL; pnodo sig; if (primero==NULL ) { primero=new nodo(v,NULL,NULL); } else { if(primero->valor>v) { n=new nodo(v,NULL,primero); primero->anterior=n; primero=n; } else { sig=primero; while(sig && sig->valor<=v) { ant=sig; sig = sig->siguiente; } n=new nodo(v, ant,sig); if (ant) ant->siguiente = n; if(sig) sig->anterior = n; } } } Msc. Walter Fernandez Toglio. 8 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) LISTAS DOBLEMENTE ENLAZADAS ORDENADAS: ELIMINACIÓN Parámetros: Lista (L) , elemento (e), posición (p) La posición debe ser válida (1 <= p <= (Long(L)) Considerar: Eliminación en primera posición, al final de la lista Procedimiento: 1. Localizar la posición 2. Actualizar los apuntadores involucrados 3. Liberar el espacio ocupado por el nodo EJEMPLO Dada la siguiente lista doblemente enlazada, se desea eliminar el nodo cuyo valor es 30 L primero nil 5 15 30 50 70 nil SOLUCIÓN 1. Localizar la posición del nodo a eliminar 1. Localizar la posición del nodo a eliminar ant=NULL; var=primero; while(var) { if (var->valor==v) break; ant=var; var=var->siguiente; } primero L ant var nil 5 15 30 50 70 nil Msc. Walter Fernandez Toglio. 9 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) 2. Actualizar apuntadores de los nodos primero L var ant nil 5 15 30 50 70 nil if(var) { if (ant) { ant->siguiente=var->siguiente; if(var->siguiente) 2. Actualizar apuntadores de los nodos involucrad os var->siguiente>anterior=ant; } Else { primero=var->siguiente; var->siguiente->anterior=NULL; } delete var; } 3. Liberar espacio ocupado por el nodo primero L 3. Liberar espacio ocupado por el ant var nodo delete var; nil 5 15 30 50 70 nil Msc. Walter Fernandez Toglio. 10 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) void listaDE::Borrar(int v) { pnodo var,ant; ant=NULL; var=primero; while(var) { if (var->valor==v) break; ant=var; var=var->siguiente; } if(var) { if (ant) { ant->siguiente=var->siguiente; if(var->siguiente) var->siguiente->anterior=ant; } else { primero=var->siguiente; var->siguiente->anterior=NULL; } delete var; } } Msc. Walter Fernandez Toglio. 11 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) EJEMPLO: LISTAS DOBLEMENTE ENLAZADAS ORDENADAS Nodo.h #include <stdio.h> class nodo { public: nodo(int v,nodo *ant=NULL,nodo *sig=NULL) { valor=v; siguiente=sig; anterior=ant; } private: int valor; nodo *anterior; nodo *siguiente; friend class listaDE; }; ListaDE.h #include <iostream> #include "Nodo.h" using namespace std; class listaDE { public: listaDE() { primero=actual=NULL; } ~listaDE(); void Insertar(int v); void Borrar(int v); bool ListaVacia() { return primero==NULL; } void Mostrar(); void Siguiente(); void Primero(); void Ultimo(); bool Actual() { return actual!=NULL; } int ValorActual() { return actual->valor; } private: nodo *primero; nodo *actual; }; Msc. Walter Fernandez Toglio. 12 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) listaDE::~listaDE() { nodo *aux; while(primero) { aux=primero; primero=primero->siguiente; delete aux; } actual=NULL; } void listaDE::Insertar(int v) { nodo *ant=NULL, *n=NULL; nodo *sig; if (primero==NULL ) { primero=new nodo(v,NULL,NULL); } else { if(primero->valor>v) { n=new nodo(v,NULL,primero); primero->anterior=n; primero=n; } else { sig=primero; while(sig && sig->valor<=v) { ant=sig; sig = sig->siguiente; } n=new nodo(v, ant,sig); if (ant) ant->siguiente = n; if(sig) sig->anterior = n; } } } void listaDE::Mostrar() { nodo *aux; aux=primero; cout<<endl<<"***DATOS LISTA***"<<endl; while(aux) { cout<<aux->valor<<"->"; aux = aux->siguiente; } cout<<endl; this->Ultimo(); aux=actual; cout<<endl<<"***DATOS LISTA INVERSO***"<<endl; while(aux) Msc. Walter Fernandez Toglio. 13 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) { cout<<aux->valor<<"->"; aux = aux->anterior; } cout<<endl<<endl; } void listaDE::Primero() { actual=primero; } void listaDE::Siguiente() { if(actual) actual=actual->siguiente; } void listaDE::Ultimo() { nodo *var; var=primero; while(var) { actual=var; var=var->siguiente; } } void listaDE::Borrar(int v) { nodo *var,*ant; ant=NULL; var=primero; while(var) { if (var->valor==v) break; ant=var; var=var->siguiente; } if(var) { if (ant) { ant->siguiente=var->siguiente; if(var->siguiente) var->siguiente->anterior=ant; } else { primero=var->siguiente; var->siguiente->anterior=NULL; } delete var; } } Prinicpal.cpp Msc. Walter Fernandez Toglio. 14 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) #include "ListaDE.h" int main(char *arg) { listaDE ObjLista; ObjLista.Insertar(20); ObjLista.Insertar(10); ObjLista.Insertar(45); ObjLista.Insertar(30); ObjLista.Insertar(40); ObjLista.Mostrar(); cout<<"Lista elementos"<<endl; ObjLista.Primero(); while(ObjLista.Actual()) { cout<<ObjLista.ValorActual()<<endl; ObjLista.Siguiente(); } ObjLista.Primero(); cout<<"Primero->"<< ObjLista.ValorActual()<<endl<<endl; ObjLista.Ultimo(); cout<<"Ultimo->"<< ObjLista.ValorActual()<<endl<<endl; ObjLista.Borrar(45); cout<<"Borrar 45: "<<endl; ObjLista.Mostrar(); cout<<endl; ObjLista.Borrar(10); cout<<"Borrar 10: "<<endl; ObjLista.Mostrar(); cout<<endl; ObjLista.Insertar(5); cout<<"Insertar 5: "<<endl; ObjLista.Mostrar(); cout<<endl; ObjLista.Insertar(60); cout<<"Insertar 60: "<<endl; ObjLista.Mostrar(); cout<<'\n'; system("PAUSE"); return 0; } Presione F5 o haga clic en Msc. Walter Fernandez Toglio. 15 C CE EN NTTR RO OS SU UP PE ER RIIO OR RS SU UP PE ER RIIO OR RD DE EA ALLTTA A E S P E C I A L I Z A C I Ó N Y A S E S O R Í A ESPECIALIZACIÓN Y ASESORÍA http://www.cfape.com P PR RO OG GR RA AM MA AC CIIÓ ÓN NE EN N LLA AP PLLA ATTA AFFO OR RM MA AW WIIN ND DO OW WS S http://www.cfape.com/ E E S T R U C T U R A D E D A T O S N E A E S E N C C C U R S O O N N E ES ST TR RU UC CT TU UR RA AD DE ED DA AT TO OS S LLLIIIN NE EA ALLLE ES SE EN NC C///C C++++++ (((C CU UR RS SO OO ON N---LLLIIIN NE E))) Msc. Walter Fernandez Toglio. 16