Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Listas dobles en java, Apuntes de Programación Informática

Ejercicios sencillos de programación

Tipo: Apuntes

2022/2023

Subido el 30/08/2023

usuario desconocido
usuario desconocido 🇧🇴

1 / 11

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
LISTAS DOBLEMENTE ENLAZADAS
Una lista doble es un conjunto de nodos, donde cada nodo contiene dos enlaces, uno a su nodo
predecesor y el otro a su nodo sucesor. La lista es eficiente tanto en recorrido directo («adelante»)
como en recorrido inverso («atrás»).
Nodo de una lista Doble
Cada nodo tiene 3 campos, el primer campo almacena el enlace con el anterior nodo, el segundo
campo almacena el elemento(información) que puede ser dato(s) simple(s) (int, string, char, etc.) u
objeto(s) y el tercer campo almacena el enlace con el siguiente nodo.
Además, un Nodo tiene una dirección de memoria donde se almacena, el cual permite el enlace.
Dirección de memoria
anterior
elemento
siguiente
Por tanto, una lista doble con nodos y sus direcciones(di) puede observarse de la siguiente manera:
P
d3 d5 d2 d6 d7 d4
null
A
d5
B
d2
C
d6
d2
d7
E
d4
F
null
Para evitar el manejo de direcciones se utiliza flechas para representar el enlace.
P
A
B
C
D
E
F
P almacena la dirección del primer nodo, a partir de cual se controla la lista mediante recorrido. Un
recorrido es visitar cada nodo desde el primero.
DIAGRAMA DE CLASES:
Nodo
ListaDoble
En la lista se
establecen
procesos para
manejar los nodos
elemento(s)
enlaceAnterior
enlaceSiguiente
P
Nodo()
//Getters
//setters
ListaDoble()
getP()
setP(p)
adiprincipio(elem)
adifinal(elem)
nroNodos()
eliprincipio()
eliFinal()
pf3
pf4
pf5
pf8
pf9
pfa

Vista previa parcial del texto

¡Descarga Listas dobles en java y más Apuntes en PDF de Programación Informática solo en Docsity!

LISTAS DOBLEMENTE ENLAZADAS

Una lista doble es un conjunto de nodos, donde cada nodo contiene dos enlaces, uno a su nodo predecesor y el otro a su nodo sucesor. La lista es eficiente tanto en recorrido directo («adelante») como en recorrido inverso («atrás»). Nodo de una lista Doble Cada nodo tiene 3 campos, el primer campo almacena el enlace con el anterior nodo, el segundo campo almacena el elemento(información) que puede ser dato(s) simple(s) (int, string, char, etc.) u objeto(s) y el tercer campo almacena el enlace con el siguiente nodo. Además, un Nodo tiene una dirección de memoria donde se almacena, el cual permite el enlace. Dirección de memoria anterior elemento siguiente Por tanto, una lista doble con nodos y sus direcciones(di) puede observarse de la siguiente manera: P d3 d5 d2 d6 d7 d null A d5 d3 B d2 d5 C d6 d2 D d7 d6 E d4 d7 F null Para evitar el manejo de direcciones se utiliza flechas para representar el enlace. P A B C D E F P almacena la dirección del primer nodo, a partir de cual se controla la lista mediante recorrido. Un recorrido es visitar cada nodo desde el primero. DIAGRAMA DE CLASES: Nodo ListaDoble En la lista se establecen procesos para manejar los nodos elemento(s) enlaceAnterior enlaceSiguiente

P

Nodo() //Getters //setters ListaDoble() getP() setP(p) adiprincipio(elem) adifinal(elem) nroNodos() eliprincipio() eliFinal()

mostrar() EJEMPLOS DE DIAGRAMAS DE CLASES LISTAS DE DATOS Lista de números P 5 23 1 3 22 8 NodoNum LDobleNum Numero ant sig

P

NodoNum() getNumero() getAnt() getSig() setNumero(n) setAnt(a) setSig(s) LDobleNum() getP() setP(p) adiprincipio(num) adifinal(num) nroNodos() eliPrincipio() eliFinal() mostrar() Lista de personas (nombre y edad) P Juan 5 Lucy 23 Ana 1 Rocio 3 Luis 22 Jose 8 NodoP LDobleP nombre edad ant sig

P

NodoP() getNombre() getEdad() getAnt() getSig() setNombre(n) setEdad(e) setAnt(a) setSig(s) LDobleP() getP() setP(p) adiprincipio(nom,ed) adifinal(nom,ed) nroNodos() eliPrincipio() eliFinal() mostrar() Lista de Estudiantes (nombre, paterno, materno, nota) P Luis Loza Rios Ana Rojas Poma

NodoE LDobleE

Para el acceso a los campos de un nodo, es necesario tener la dirección del nodo y a partir de esta dirección con los métodos getters se accede a los mismos. r ant elem sig r .getAnt() r.getNum() r .getSig() Para recorrer al siguiente nodo se asigna el enlace del siguiente a la variable de recorrido r = r .getSig() Para recorrer al anterior nodo se asigna el enlace del anterior a la variable de recorrido r = r .getAnt() P r 1 r 5 23 1 3 22 8 Seudocódigo para recorrer una lista doble Recorrido al Siguiente con r 1 Recorrido al Anterior con r 2 r 1 = getP() //toma la dirección del primer nodo while r 1 ≠ null //mientras no llegue al final o a tierra r 1 = r 1 .getSig() // recorre al siguiente nodo r 1 = getP() //toma la dirección del primer nodo while r1.getSig() ≠ null //mientras no llegue al último nodo r 1 = r 1 .getSig() // recorre al siguiente nodo r2 = r1 //toma la dirección del ultimo nodo while r 2 ≠ null //mientras no llegue al final o a tierra r 2 = r 2 .getAnt() // recorre al siguiente nodo

EJEMPLO

Sea la lista de las temperaturas registradas, donde cada nodo almacena fecha, hora, temperatura CASO : Lista de Datos Diagrama de clases NodoT LDobleT fecha hora gradoC ant sig

P

NodoT() getters setters LDobleT() getP() setP() nroNodos() adiprincipio(f,h,t) adifinal(f,h,t) eliprincipio() elifinal() leer1(n) leer2(n) mostrar() IMPLEMENTACION EN SEUDOCODIGO

class NodoT { private string fecha, hora int gradoC NodoT ant,sig public NodoT() { ant=sig=null } getFecha() { returm fecha } getHora() { returm hora } getGradoC() { returm gradoC } getAnt() {return ant} getSig() {return sig} setFecha(string f) { fecha=f} setHora(string h) { hora=h} setGradoC(int g) { grado=g} setAnt(a) { ant=a} setSig(s) {sig=s} } class LDobleT { private NodoT p public LDobleT () { p=null } getP () {return p} setP (NodoT pp){p=pp} nroNodos () { NodoT r=getP() int c= while r≠null { c=c+ r=r.getSig() } Return r } adiprincipio (string f,h,int t) { nue=new NodoT() nue.setFecha(f) nue.setHora(h) nue.setGradoC(t) if getP()=null setP(nue) else{ nue.setSig(getP()) getP().setAnt(nue) setP(nue) } } adifinal (string f,h,int t) { nue=new NodoT() nue.setFecha(f) nue.setHora(h) nue.setGradoC(t) if getP()=null setP(nue) else { NodoT r=getP() while r.getSig()≠null r=r.getSig() nue.setAnt(r) r.setSig(nue) } } eliprincipio () { NodoT r=getP() setP(r.getSig) getP().setAnt(null) r.setSig(null) return r } elifinal () { NodoT r r=getP()

NodoTO() { sig=null } getT() { returm t } getAnt() {return ant} getSig() {return sig} setT(Temperatura x) { t=x} setAnt(NodoTO a) {ant=a} setSig(NodoTO s) {sig=s} } { p=null } getP () {return p} setP (NodoTO pp){p=pp} nroNodos () { NodoTO r=getP() int c= while r ≠ null { c=c+ r=r.getSig() } return c } adiprincipio (Temperatura x) { nue=new NodoTO() nue.setT(x) if getP()=null setP(nue) else{ nue.setSig(getP()) getP().setAnt(nue) setP(nue) } } adifinal (Temperatura x) { nue=new NodoTO() nue.setT(x) if getP()=null setP(nue) else { NodoT r=getP() while r.getSig()≠null r=r.getSig() nue.setAnt(r) r.setSig(nue) } } eliprincipio () { NodoTO r=getP() setP(r.getSig) getP().setAnt(null) r.setSig(null) return r } elifinal () { NodoTO r r=getP() while r.getSig() ≠ null r=r.getSig() q=r.getAnt() q.setSig(null) r.setAnt(null) return r } leer1 (int n) { for i=1 to n { x=new Temperatura()

x.leer() adiprincipio(x) } } Leer2 (int n) { for i=1 to n { x=new Temperatura() x.leer() adifinal(x) } } mostrar () { NodoTO r=getP() while r≠null { r.getT().mostrar() r=r.getSig() } } } Begin A=new LDobleTO() A.leer1(4) A.mostrar() A.leer2(3) A.mostrar() BajoCero(A) End BajoCero(LDobleTO B) { NodoTO w=B.getP() while w≠null { if w.getGradoC()< print (w.getT().getFecha()) w=w.getSig() } } PROBLEMAS ADICIÓN/INSERCIÓN/ELIMINACIÓN

1. Adicionar una nueva temperatura después de cada temperatura de la lista. Lista de Datos Temperatura Lista de Objetos Temperatura Adicionar 1 (LDobleT a) { NodoT r=a.getP()// r en el primer nodo while r ≠ null //mientras no es el final { q=r.getSig() //guarda dirección siguiente nue=new NodoT() //crea nuevo nodo read(f,h,g) //lectura de datos Adicionar1(LDobleTO a) { NodoTO r=a.getP() while r ≠ null { q=r.getSig() //guarda dirección siguiente nue=new NodoT() //crea nuevo nodo tm=new Temperatura() //crea objeto Temperatura

nue.setHora(h)// al nuevo nodo nue.setGradoC(g) w.setSig(nue) nue.setAnt(w) nue.setSig(q) if q ≠ null q.setAnt(nue) w=q } else w=w.getSig() } } nue.setT(tm) w.setSig(nue) nue.setAnt(w) nue.setSig(q) if q ≠ null q.setAnt(nue) w=q } else w=w.getSig() }

4. Eliminar las temperaturas bajo cero elimBajoCero(LDobleT A) { NodoT q=A.getP() while q ≠ null { If q.getGradoC()< { if q=A.getP() { A.setP(q.getSig()) A.getP().setAnt(null) q=A.getP() } else { NodoT w1=q.getAnt() NodoT w2=q.getSig() w 1 .setSig(w2) if w2 ≠ null w2.setAnt(w1) q=w 2 } } else{ q=q.getSig() } } } 5. Eliminar el i- ésimo nodo Eliminar(LSimpleT A, int i) { int c= NodoT w=A.getP() If i = 1 { A.setP(w.getSig()) A.getP().setAnt(null) } else { while w ≠ null { if c = i {

NodoT q1=w.getAnt() NodoT q2=w.getSig() q1.setSig(q2) if q2 ≠ null q2.setAnt(q1) w=null } else{ w=w.getSig() } c = c + 1 } } } En los dos procesos de eliminación solo se elimina los enlaces, dependerá del problema si los nodos eliminados se utilizaran.