Ingeniería de Sistemas e Informática Nombre Juan José Ruiz, Mauro Rivadeneira Maldonado Fecha: 23/05/2016 Período: Abril – agosto 2016
N!: 1100
"str#ct#ra de datos
1.- Tema. – Listas doblemente enlazadas con ordenamiento 2.- Objetivos
Objetivo General. - Aprender el funcionamiento de las listas doblemente enlazadas.
Objetivos Específcos:
Ordenar una lista doblemente enlazada
3.- Desarrollo: Marco Terico !ista "oblemente enla#a"a:
Una lista doblemente enlazada tiene en sus nodos 2 enlaces (atrás y adelante) estos enlaces que son punteros de tipo nodo apuntan a la dirección de memoria de otros 2 nodos que se encuentran en la lista antes y después del nodo que estemos trabaando respecti!amente" además del dato" esto permite recorrer recorrer la lista en todas direcciones. #anto #anto el primer nodo de la lista como el ultimo deben tener sus respecti!os enlaces $sueltos% apuntando a &ULL. 'onstruimos además métodos para que puedan accederse y modicarse estos atributos indi!idualmente fuera de la clase nodo.
espués del nodo se crea la clase lista" esta clase cuenta al i*ual que la lista simple con un atributo puntero que sir!e de
cabecera (cabeza)" y es el que siempre !a a apuntar al primer elemento de la lista" además ser!irá como referencia para operaciones como son+ insertar" eliminar o buscar. Las operaciones de la lista doble son muy similares a las de la simple" pero *racias a que contamos con apuntadores ,acia los nodos de atrás y adelante no necesitamos punteros au-iliares que nos den la dirección de al*n nodo anterior ya que es posible trabaar con los enlaces en ciertos casos. Or"enar $na lista "oblemente enla#a"a:
/s posible ordenar una lista doblemente enlazada utilizando el método de la burbua" al i*ual que con los arre*los estáticos" se puede mo!er el elemento de un nodo a otro ya sea ascendentemente o descendentemente para ordenar los !alores" para ello se utilizan 2 punteros 0ndices que estarán apuntando a 2 nodos a la !ez" una !ez ordenado pasaran a los 2 nodos si*uientes. /s más sencillo de esta forma para no tener que romper y armar los enlaces. %.- &"i'o typedef int ato1 include 3iostream3 usin* namespace std1 class &odo2 4 protected+ ato dato1 &odo25 adelante1 &odo25 atras1 public+ &odo2(ato)1 !oid setatras(&odo25)1 !oid setadelante(&odo25)1 !oid setdato(ato)1 ato *etdato()1 &odo25 *etatras()const1 &odo25 *etadelante()const1 61 include 3stdaf-.,3 include 3&odo2.,3 &odo2++&odo2(ato dato) 4 t,is78dato 9 dato1 adelante 9 atras 9 &ULL1 6 !oid &odo2++setatras(&odo2 5atras) 4 t,is78atras 9 atras1 6 !oid &odo2++setadelante(&odo2 5adelante)
4 t,is78adelante 9 adelante1 6 !oid &odo2++setdato(ato dato) 4 t,is78dato 9 dato1 6 ato &odo2++*etdato() 4 return dato1 6 &odo2 5 &odo2++*etatras() const 4 return atras1 6 &odo2 5 &odo2++*etadelante() const 4 return adelante1 6 include 3&odo2.,3 class Lista:doble 4 pri!ate+ &odo2 5cabeza1 public+ Lista:doble()1 Lista:doble(ato)1 !oid insertar:inicio(ato)1 !oid insertar:nal(ato)1 !oid insertar:despues:de(&odo25" ato)1 !oid insertar:antes:de(&odo25" ato)1 !oid eliminar(ato)1 &odo25 buscarlista(ato)1 &odo25 buscarposicion(int)1 !oid insertarorden:ascendente(ato)1 !oid insertarorden:descendente(ato)1 !oid ordenar:ascendente()1 !oid ordenar:descendente()1 !oid mostrarlista()1 61 include 3stdaf-.,3 include 3Lista:doble.,3 Lista:doble++Lista:doble() 4 cabeza 9 &ULL1 6 Lista:doble++Lista:doble(ato dato) 4 cabeza 9 ne; &odo2(dato)1 6 !oid Lista:doble++insertar:inicio(ato dato)
4 &odo25 nue!o 9 ne; &odo2(dato)1 nue!o78setadelante(cabeza)1 if (cabeza <9 &ULL) 4 cabeza78setatras(nue!o)1 6 cabeza 9 nue!o1 6 !oid Lista:doble++insertar:nal(ato dato) 4 &odo25p1 &odo25 nue!o9 ne; &odo2(dato)1 if (cabeza 99 &ULL) 4 cabeza 9 nue!o1 6 else 4 for (p 9 cabeza1 p78*etadelante() <9 &ULL1 p 9 p78*etadelante()) 4 6 p78setadelante(nue!o)1 nue!o78setatras(p)1 6 6 !oid Lista:doble++insertar:despues:de(&odo2 5antes" ato dato) 4 &odo25 nue!o 9 ne; &odo2(dato)1 if (cabeza 99 &ULL) 4 cout == 3la lista esta !acia3 == endl1 6 else 4 nue!o78setadelante(antes78*etadelante())1 nue!o78setatras(antes)1 antes78setadelante(nue!o)1 if (antes78*etadelante() <9 &ULL) 4 antes78*etadelante()78setatras(nue!o)1 6 6 6 !oid Lista:doble++insertar:antes:de(&odo2 5despues" ato dato) 4 &odo25 nue!o 9 ne; &odo2(dato)1 >>if (despues78*etatras() 99 &ULL) 4 if (cabeza99despues)4 insertar:inicio(dato)1 6 else 4 nue!o78setatras(despues78*etatras())1 nue!o78setadelante(despues)1 nue!o78*etatras()78setadelante(nue!o)1 despues78setatras(nue!o)1 6 6 !oid Lista:doble++eliminar(ato dato) 4 &odo2 5p1 p 9 cabeza1 if (p 99 &ULL) 4
3La lista esta !acia31 6 else 4 if (dato 99 p78*etdato()) 4 p 9 p78*etadelante()1 cabeza 9 p1 6 else 4 do 4 p 9 p78*etadelante()1 if (p78*etdato() 99 dato) 4 p78*etatras()78setadelante(p78*etadelante())1 if (p78*etadelante() <9 &ULL) 4 p78*etadelante()78setatras(p78*etatras())1 6 brea?1 6 6 ;,ile (p78*etadelante() <9 &ULL)1 6 6 6 &odo2 5 Lista:doble++buscarlista(ato dato) 4 &odo25p1 p 9 cabeza1 ;,ile (p <9 &ULL) 4 if (p78*etdato() 99 dato) 4 return p1 6 p 9 p78*etadelante()1 6 return &ULL1 6 &odo2 5 Lista:doble++buscarposicion(int static posicion) 4 &odo25p1 int cont 9 @1 p 9 cabeza1 if (posicion = @p99&ULL) 4 return &ULL1 6 for (cont 9 @1 cont = posicion BB p <9 &ULL1contCC" p 9 p78*etadelante())4 6 return p1 6 !oid Lista:doble++insertarorden:ascendente(ato dato) 4 &odo25 nue!o9ne; &odo2(dato)1 &odo25p1 p 9 cabeza1 if (p 99 &ULL dato = p78*etdato()) 4 insertar:inicio(dato)1 6 else 4 do 4 p 9 p78*etadelante()1 if (p 99 &ULL) 4
insertar:nal(dato)1 6 else if (dato =9 p78*etdato()) 4 nue!o78setatras(p78*etatras())1 nue!o78setadelante(p)1 nue!o78*etatras()78setadelante(nue!o)1 p78setatras(nue!o)1 brea?1 6 6 ;,ile (p <9 &ULL)1 6 6 !oid Lista:doble++insertarorden:descendente(ato dato) 4 &odo25 nue!o 9 ne; &odo2(dato)1 &odo25p1 p 9 cabeza1 if (p 99 &ULL dato 8 p78*etdato()) 4 insertar:inicio(dato)1 6 else 4 do 4 p 9 p78*etadelante()1 if (p 99 &ULL) 4 insertar:nal(dato)1 6 else if (dato 8 p78*etdato()) 4 nue!o78setatras(p78*etatras())1 nue!o78setadelante(p)1 nue!o78*etatras()78setadelante(nue!o)1 p78setatras(nue!o)1 brea?1 6 6 ;,ile (p <9 &ULL)1 6 6 !oid Lista:doble++ordenar:ascendente() 4 &odo2 5p" 5q1 ato au-1 p 9 cabeza1 for (p 9 cabeza1 p <9 &ULL1 p 9 p78*etadelante()) 4 for (q 9 p78*etadelante()1 q <9 &ULL1 q 9 q78*etadelante()) 4 if (p78*etdato() 8 q78*etdato()) 4 au- 9 p78*etdato()1 p78setdato(q78*etdato())1 q78setdato(au-)1 6 6 6 6 !oid Lista:doble++ordenar:descendente() 4 &odo2 5p" 5q1
ato au-1 p 9 cabeza1 for (p 9 cabeza1 p <9 &ULL1 p 9 p78*etadelante()) 4 for (q 9 p78*etadelante()1 q <9 &ULL1 q 9 q78*etadelante()) 4 if (p78*etdato() = q78*etdato()) 4 au- 9 p78*etdato()1 p78setdato(q78*etdato())1 q78setdato(au-)1 6 6 6 6 !oid Lista:doble++mostrarlista() 4 &odo2 5p1 p 9 cabeza1 do 4 cout == p78*etdato() == 3 31 p 9 p78*etadelante()1 6 ;,ile (p <9 &ULL)1 6 include 3stdaf-.,3 include 3Lista:simple.,3 include 3Lista:doble.,3 include =Dindo;s.,8 usin* namespace Eystem1 !oid *oto-y(int -" int y)>>Funcion para que nos permita el uso del *oto-y 4 'OOG coord1 coord.H 9 -1 coord.I 9 y1>>'oordenadas de - y y JA&L/ ,EtdOut 9 KetEtdJandle(E#:OU#U#:JA&L/)1 Eet'onsole'ursorosition(,EtdOut" coord)1 6 !oid menu(Lista:doble l2) 4 ato au-1 &odo2 5au-nodo1 c,ar opl 9 MNM1 do 4 system(3cls3)1 system(3color F3)1 cout == 3PtPt>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Pn<31 cout == 3PtPt55Q/&U LRE#AE /&LASAAE OTL/E Pn31 cout == 3PtPt Pn31 cout == 3PtPt @+ Rnsertar al inicio Pn31 cout == 3PtPt 2+ Rnsertar al nal Pn31 cout == 3PtPt + Rnsertar despues de un numero Pn31 cout == 3PtPt + Rnsertar antes de un numero Pn31 cout == 3PtPt V+ Tuscar un numero Pn31 cout == 3PtPt W+ Tuscar en una posicion Pn31 cout == 3PtPt X+ Rnsertar en orden ascendente Pn31 cout == 3PtPt Y+ Rnsertar en orden descendente Pn31 cout == 3PtPt Z+ Qostrar lista Pn31 cout == 3PtPt a+ Ordenar lista ascendente Pn31 cout == 3PtPt d+ Ordenar lista descendente Pn31 cout == 3PtPt -+ Ealir Pn31 cout == 3PtPt e+ /liminar Pn31 cout == 3PtPt>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Pn31 *oto-y(N" 2N)1 cout == 3E/L/''RO&/ O'RO&+31
cin 88 opl1 s;itc, (opl) 4 case M@M+ system(3cls3)1 cout == 3in*rese un numero3 == endl1 cin 88 au-1 l2.insertar:inicio(au-)1 l2.mostrarlista()1 system(3pause3)1 brea?1 case M2M+ system(3cls3)1 cout == 3in*rese un numero3 == endl1 cin 88 au-1 l2.insertar:nal(au-)1 l2.mostrarlista()1 system(3pause3)1 brea?1 case MM+ system(3cls3)1 cout == 3in*rese un numero anterior3 == endl1 cin 88 au-1 au-nodo 9 l2.buscarlista(au-)1 if (au-nodo 99 &ULL) 4 cout == 3no e-iste el numero en la lista3 == endl1 6 else 4 cout == 3in*rese un numero a in*resar3 == endl1 cin 88 au-1 l2.insertar:despues:de(au-nodo" au-)1 l2.mostrarlista()1 6 system(3pause3)1 brea?1 case MM+ system(3cls3)1 cout == 3in*rese un numero anterior3 == endl1 cin 88 au-1 au-nodo 9 l2.buscarlista(au-)1 if (au-nodo 99 &ULL) 4 cout == 3no e-iste el numero en la lista3 == endl1 6 else 4 cout == 3in*rese un numero a in*resar3 == endl1 cin 88 au-1 l2.insertar:antes:de(au-nodo" au-)1 l2.mostrarlista()1 6 system(3pause3)1 brea?1 case MVM+ system(3cls3)1 cout == 3in*rese un numero a buscar3 == endl1 cin 88 au-1 au-nodo 9 l2.buscarlista(au-)1 if (au-nodo 99 &ULL) 4 cout == 3no e-iste el numero en la lista3 == endl1 6
else 4 cout == 3el numero si e-iste3 == endl1 l2.mostrarlista()1 6 system(3pause3)1 brea?1 case MWM+ system(3cls3)1 int pos 1 cout == 3in*rese posicion3 == endl1 cin 88 pos1 au-nodo 9 l2.buscarposicion(pos)1 if (au-nodo 99 &ULL) 4 cout == 3no e-iste el numero en la lista3 == endl1 6 else 4 cout == 3el numero de la posicion 3 ==pos==3es+ 3==au-nodo78*etdato()== endl1 6 >> l2.mostrarlista()1 system(3pause3)1 brea?1 case MXM+ system(3cls3)1 cout == 3in*rese un numero3 == endl1 cin 88 au-1 l2.insertarorden:ascendente(au-)1 l2.mostrarlista()1 system(3pause3)1 brea?1 case MYM+ system(3cls3)1 cout == 3in*rese un numero3 == endl1 cin 88 au-1 l2.insertarorden:descendente(au-)1 l2.mostrarlista()1 system(3pause3)1 brea?1 case MZM+ system(3cls3)1 l2.mostrarlista()1 system(3pause3)1 brea?1 case MaM+ system(3cls3)1 cout == 3Lista ordenada ascendentemente3 == endl1 l2.ordenar:ascendente()1 l2.mostrarlista()1 system(3pause3)1 brea?1 case MdM+ system(3cls3)1 cout == 3Lista ordenada descendentemente3 == endl1 l2.ordenar:descendente()1 l2.mostrarlista()1 system(3pause3)1 brea?1 case MeM+ system(3cls3)1 cout == 3in*rese un numero3 == endl1
cin 88 au-1 l2.eliminar(au-)1 l2.mostrarlista()1 system(3pause3)1 brea?1 case M-M+ brea?1 6 6 ;,ile (opl <9 M-M)1 6 int main() 4 Lista:doble l21 menu(l2)1 system(3pause3)1 return N1 6
(.- &oncl$sin
Las listas doblemente enlazadas funcionan de manera similar a las listas simplemente enlazadas" pero su se*undo enlace (atrás) puede facilitar al*unos procesos.
).- *ecomen"aciones
/specicar bien los identicadores de los enlaces para no tener problemas al momento de ,acer las operaciones" es recomendable especicar cuál es el enlace de atrás y cual el de adelante" e!itar poner nombres como enlace@ y enlace2. #ener en cuenta cual es la cabeza de la lista" pues está siempre !a a ser nuestra referencia" siempre debe estar apuntando al primer elemento de la lista.
+.- ,iblio'rafa
Tiblio*raf0a [oyanes" A*uilar.(2NNX). /structura de datos en 'CC (@\ ed.).Qadrir"/spa]a+Qc*ra;7Jill.