






Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Ejercicios sencillos de programación
Tipo: Apuntes
Subido el 30/08/2023
1 / 11
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!







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
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
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
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
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
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.