Sei sulla pagina 1di 13

UNIDAD ACADMICA N 02:

LISTAS
Previamenteenestetema,esnecesarioconocerlasestructurasde
datosmsbsicas:losarraysylosvectores.
Aunque los arrays son una buena solucin para almacenar un
conjunto del mismo tipo de objetos. Si ms adelante, durante la
ejecucin del programa, necesitramos modificar su tamao para que
contenga ms o menos elementos, la nica alternativa posible sera
asignarunnuevoespaciode memoriadeltamaorequeridoyadems,
copiar en l los datos que necesitamos conservar de la matriz original.
La nueva matriz pasar a ser la matriz actual y la matriz origen se
destruir,siyanofueranecesaria.
Esevidentequelasolucinplanteadanoeslamsidonea,debidoa
que la cantidad de memoria utilizada en el sistema con estas
caractersticas podra ser ingente y sera necesario modificar el cdigo
para manipular todos los espacios vacos. Un mtodo ms eficaz para
almacenar los datos que puedan requerir numerosas adiciones y
eliminaciones,sonlaslistasenlazadas.

Alfinalizarelestudiodelapresenteunidadtemticaelestudiante:
1. Definelalaslistas.
2. Conceptaloqueesunalistaysusdiferentestipos.
3. Resuelveproblemasaplicandolistasensusdiferentesformas.

Ing. Wagner E. Vicente Ramos

1. LISTASENLAZADAS
Unalistaesunconjuntodeelementosdelmismotipoconunordenconcreto
yalmacenadoenmemoria.
Una lista enlazada esuna coleccin, originalmente vaca, de elementos u
objetos de cualquier tipo, que durante la ejecucin saben" dnde se
encuentraelsiguientemiembrodelalistaenlamemoriadelordenador(no
necesariamente consecutivos). Para lograrlo, cada objeto de la lista debe
almacenarlaubicacinenlamemoriadelsiguienteobjetodelalista.
En funcin de la informacin que cada elemento de la lista almacena
respecto a la localizacin de sus antecesores o predecesores, las listas
puedenclasificarseen:listassimplementeenlazadas,listascirculares,listas
doblementeenlazadasylistascircularesdoblementeenlazadas.

2. LISTALINEALSIMPLEMENTEENLAZADA
Unalistaenlazadaesunaseriedenodos,conectadosentresatravsde
unareferencia,endondesealmacenalainformacindeloselementosdela
lista.
Estetipodelistaspuedendesplazarseenlalistaenunasoladireccin.

Cadanodosecomponededospartes:
Undatodeltipobasedelgrupo.
Unareferenciaalsiguientenododelalista

classnodolista{
intdato//Variabledatodetipoentero
nodolistasiguiente//REFERENCIAALSIGUIENTENODO
publicnodolista(inta)//Constructorqueinicializalas
variables
//Asignandoelvalordeaparadatoynuloparasiguiente
{
dato=a
siguiente=null
}
}

ElaccesoalaListaEnlazadaserealizavalareferenciaalprimernodo.La
referencia contenida en el nodo de unalista se denomina siguiente, pues
Ing. Wagner E. Vicente Ramos

indica en dnde se encuentra el siguiente elemento de la lista. El ltimo


elemento de la lista no tiene nodo siguiente, por lo que se dice que la
referenciasiguientedelltimoelementoesnull(nula).
La siguiente figura muestra un ejemplo de una lista enlazada cuyos
elementossonstrings:

La referencia inicio indica la posicin del primer elemento de la lista y


permite acceder a todos los elementos de sta: basta con seguir las
referenciasalnodosiguientepararecorrerlalista.
NodoListaactual=inicio

actual=actual.siguiente

EsterecorridodelalistaseimplementaenelmtodoVisualizar
publicvoidvisualizar()
{
nodolistaactual=inicio
while(actual!=null)
{
System.out.print(actual.dato+"")
actual=actual.siguiente
}
}

2.1.OperacionesBsicasconunaLista
Las operaciones que podemos realizar con listas incluyen
fudamentalmentelassiguientes:
InsertarNodoalComiezo:Insertaunnodocondatoaalcomienzo
Ing. Wagner E. Vicente Ramos

delalista.
Para lo cual primero se crea el nodo y luego se reasigna las
referencias,talcomoseindicaacontinuacin.
//MtodoINSERTARPRINCIPIOdetipoLISTA
publiclistainsertarprincipio(inta)
{
//SecreaelnodoNUEVOquecontendrelvalordelavariable
pasadocomoparmetro
nodolistanuevo=newnodolista(a)
//Almacenalalocalizacindelsiguientenodo
nuevo.siguiente=inicio
//Sehacerefernciaalprincipiodelalista
inicio=nuevo
returnthis
}

Recorrer una Lista: Muestra todos los nodos de la lista desde el


comienzohatsaelfinal.VermtodoVisualizar.
Buscar Nodo: Busca un determinado dato del nodo en una lista
cuyo primer nodo esta referenciado por inicio. La bsqueda es
secuencialyterminacuandoseencuentraaldatodelnodo,obien
cuandosellegaalfinaldelalista.
//MetodoBUSCARquedevolveraunvalordetiponodolista
publicnodolistabuscar(intdat)
{
nodolistaj
//Recorrelalistadesdeeliniciohastafinallista
try{
for(j=inicioj!=nullj=j.siguiente)
{
if(dat==j.dato){returnj}
}
}
catch(Exceptione){
}
returnnull
}

Insertar Nodo Antes de un Nodo Cualquiera: Para lo cual se


busca un determinado dato del nodo en una lista. Una vez
identificadoelnodo,seintercambialasreferencias.

Ing. Wagner E. Vicente Ramos

//MtodoqueInsertaunnodoencualquierpartedelalista
publiclistainsertarnodox(intdat,nodolistaj)
{
//Encuentralareferenciaalnodoespecifico
//"nuevo"eslareferenciadelnodoainsertarenlalista
nodolistanuevo=newnodolista(dat)
//CambiodeReferenciaalsiguientenodo
nuevo.siguiente=j.siguiente
//Cambiodereferenciadelnodoanterior
j.siguiente=nuevo
returnthis
}

Borrartodosloselementosdeunalista:Enviaalabasuraacada
uno de los elementos de la misma. Supongamos que queremos
borrar una lista, cuyo primer elemento est referenciado por inicio.
Lasecienciadeoperacionesserlasiguiente:
publicvoidborrartodo()
{
nodolistaactual=inicio
while(actual!=null)
{
inicio=inicio.siguiente
actual=null
actual=inicio
}
}

EjemplodelaListaSimplementeEnlazada
Ejemplolista.java
importjava.io.*
classnodolista{
intdato//Variabledatodetipoentero
nodolistasiguiente//REFERENCIAALSIGUIENTENODO
publicnodolista(inta)//Constructorqueinicializalasvariab
//Asignandoelvalordeaparadatoynuloparasiguiente
{
dato=a
siguiente=null
}
}
classlista
{
privatenodolistainicio//Defineiniciodetiponodolista
publiclista()//Constructorinicializavariableinicioennulo
{
inicio=null
}
//METODOS
//MtodoInsertarPrincipiodetipoLista.
//Estemtodoserviraparainsertarunnodo
publiclistainsertarprincipio(inta)

Ing. Wagner E. Vicente Ramos

{
//SecreanodoNUEVO
nodolistanuevo=newnodolista(a)
//Almacenalalocalizacindelsiguientenodo
nuevo.siguiente=inicio
//Sehacereferenciaalprincipiodelalista
inicio=nuevo
returnthis
}
//Mtodoqueimprimeenpantallalalistaactual,empezando
desdeelinicio
publicvoidvisualizar()
{
nodolistaactual=inicio
while(actual!=null)
{
System.out.print(actual.dato+"")
actual=actual.siguiente
}
}

//MetodoBUSCARquedevolveraunvalordetiponodolista
publicnodolistabuscar(intdat)
{
nodolistaj
//Recorrelalistadesdeeliniciohastafinallista
try{
for(j=inicioj!=nullj=j.siguiente)
{
if(dat==j.dato)
{returnj}
}
}
catch(Exceptione){
}
returnnull
}

//MtodoqueInsertaunnodoencualquierpartedelalista
publiclistainsertarnodox(intdat,nodolistaj)
{
//Encuentralareferenciaalnodoespecifico
//"nuevo"eslareferenciadelnodoainsertarenlalista
nodolistanuevo=newnodolista(dat)
//CambiodeReferenciaalsiguientenodo
nuevo.siguiente=j.siguiente
//Cambiodereferenciadelnodoanterior
j.siguiente=nuevo
returnthis
}
//MtodoqueBorraTodoslosnodosdelalista
publicvoidborrartodo()
{
nodolistaactual=inicio
while(actual!=null)
{
inicio=inicio.siguiente

Ing. Wagner E. Vicente Ramos

actual=null
actual=inicio
}
}
}

//CLASEPRINCIPALQUEINICIAELPROGRAMA
publicclassejemplolista
{
publicstaticvoidmain(String[]args)
throwsIOException
{
//CrealalistaLde10nmerosenteros
listal=newlista()
for(inti=0i<10i++)
{
l.insertarprincipio(i+1)
}
l.visualizar()
System.out.println()
//RealizarOperaciones
BufferedReaderin=newBufferedReader(newInputStreamReader(System.in))

System.out.println("IngreseNumeroaBuscar:")
intnumb=Integer.parseInt(in.readLine())
System.out.println("IngreseNumeroaInsertar:")
intnumi=Integer.parseInt(in.readLine())
//Buscarenlalistaeldatonumb
nodolistan=l.buscar(numb)
System.out.print("Numeroencontradoes:")
System.out.println(n.dato)
//Insertaeldatonumidespusdeldatonumb
l.insertarnodox(numi,n)
System.out.print("LanuevaListaEs:")
l.visualizar()
}
}

3. LISTALINEALDOBLEMENTEENLAZADA
En una lista de doble enlace se agrega una segunda referencia al nodo
previo,lo que permite recorrerlalista en ambos sentidos, y en general se
implementaconunareferenciaalprimerelementoyotrareferenciaalltimo
elemento.

Ing. Wagner E. Vicente Ramos

ListaDoble.java
publicclassListaDoble{
intinfo
ListaDoblerinicio
//Referenciaalinicio
ListaDoblerfinal
//Referenciaalfinal
ListaDobleranterior //Referenciaalanterior
ListaDoblersiguiente//Referenciaalsiguiente
publicListaDoble(){
rinicio=rfinal=ranterior=rsiguiente=null
}
publicvoidanula(){
rinicio=rfinal=null
}
publicvoidinserta(intx){
ListaDoblenuevo
//Crearnuevodato
nuevo=newListaDoble()
nuevo.info=x
//Primerdato
if(rinicio==null){
nuevo.ranterior=null
nuevo.rsiguiente=null
rinicio=rfinal=nuevo
}else{
rfinal.rsiguiente=nuevo
nuevo.rsiguiente=null
nuevo.ranterior=rfinal
rfinal=nuevo
}
}
publicvoidContenidoAvanza(){
//paraestecasoptomalareferenciadeinicio
ListaDoblep
System.out.println("Impresiondelalista")
p=rinicio
if(p!=null){
while(p!=null){
System.out.print(""+p.info+"\t")
p=p.rsiguiente
}
}
System.out.println()
}
publicvoidContenidoRetrocede(){
ListaDoblep
System.out.println("Impresindelalista")
p=rfinal
if(p!=null){
while(p!=null){
System.out.print(""+p.info+"\t")
p=p.ranterior
}
}

Ing. Wagner E. Vicente Ramos

System.out.println()
}

publicstaticvoidmain(String[]args){
ListaDobleL=newListaDoble()
intx=0,sw,opcion
sw=1
do{
System.out.println("\n\n\n\nProcesamientodeunalista
doblementeenlazada\n")
System.out.println("0.Salir")
System.out.println("1.Anulalista")
System.out.println("2.Insertaunelementoalalista")
System.out.println("3.Contenidodelalista:Avance")
System.out.println("4.Contenidodelalista:Retrocede")
System.out.print("Opcion==>")
opcion=Leer.datoInt()
switch(opcion){
case0:sw=0break
case1:L.anula()break
case2:
System.out.print("Digitevalorainsertar==>")
x=Leer.datoInt()
L.inserta(x)
break
case3:
L.ContenidoAvanza()break
case4:
L.ContenidoRetrocede()break
}
}while(sw==1)
}
}

Para al correcta ejecucin de este programa, se debe considerara la clase


Leer.javadesarrolladoenelcursoanterior.
4. LISTACIRCULARSIMPLEMENTEENLAZADA
Esaquellaendondelareferenciasiguientedelltimonodoenvezdeser
nullapuntaalprimernododelalista.Elconceptoseaplicatantoalistas
deenlacesimplecomodoblementeenlazadas.

Ing. Wagner E. Vicente Ramos

ListaSimpleCirc.java
publicclassListaSimpleCirc{
intinfo
ListaSimpleCircultimo
//Punteroalultimo
ListaSimpleCircsiguiente //Punteroalsiguienteuiente
ListaSimpleCirc(){
ultimo=siguiente=null
}
publicvoidanula(){
ultimo=null
}
publicvoidinserta(intx){
ListaSimpleCircnuevo
//Crearnuevodato
nuevo=newListaSimpleCirc()
nuevo.info=x
//Primerdato
if(ultimo==null)ultimo=nuevo
elsenuevo.siguiente=ultimo.siguiente
ultimo.siguiente=nuevo
ultimo=nuevo
}
publicvoidcontenido(){
ListaSimpleCircp
System.out.println("Impresiondelalista")
p=ultimo
if(p!=null){
while(ultimo!=p.siguiente){
p=p.siguiente
System.out.print(""+p.info+"\t")
}
p=p.siguiente
System.out.println(p.info)
}
}
publicstaticvoidmain(String[]args){
ListaSimpleCircL=newListaSimpleCirc()
intx=0,sw,opcion
sw=1
do{
System.out.println("\n\n\n\nProcesamientodeunalistacircular
simplementeenlazada\n")
System.out.println("0.Salir")
System.out.println("1.Anulalista")
System.out.println("2.Insertaunelementoalalista")
System.out.println("3.Contenidodelalista")
System.out.print("Opcion==>")
opcion=Leer.datoInt()
switch(opcion){
case0:sw=0break
case1:L.anula()break
case2:

Ing. Wagner E. Vicente Ramos

System.out.print("Digitevalorainsertar==>")
x=Leer.datoInt()
L.inserta(x)
break
case3:
L.contenido()break
}
}while(sw==1)
}
}

5. LISTACIRCULARDOBLEMENTEENLAZADA

ACTIVIDAD 1
1. Conceptualice las listas. De un ejemplo que Ud. Observa en la realidad
2. Realice un programa que permita ordenar una lista simple.
3. Conceptualice la lista circular
4. Realice un programa que permita crear una lista circular.

Enestecapituloseexplicadeunamanerasencillalaformadeutilizarlaslistascomo
un tipo de estructurade dato, se consideran los diferentes algoritmosenel lenguaje
Java para trabajar con ellas, luego se desarrollan los codigos en JCreator para su
funcionamiento.

Ing. Wagner E. Vicente Ramos

BibliografaBsica
LuisJoyanesAguilar.EstructuradedatosenJava.McgrawHill,2007
M.A.Weiss.EstructurasdeDatosenJava:compatibleconJAVA2.2006.
Fco.JavierCeballos.Java2CursodeProgramacin(3aEd).2005.
LuisJoyanesAguilar.Java2ManualdeProgramacin.McgrawHill,2005.
BibliografaComplementaria
Aho, Alfred V. Hopcroft, John E. y Ullman, Jeffery D. Estructura de Datos y
Algoritmos.EditorialAddison*Wesley.2002
Wirth,N.AlgoritmosyEstructurasdedatos.EditorialPrenticeHall.2004
Seymour Lipschutz. Estructura de datos. Ed. Serie Shaumm Mc. GrawHill.
2004
Shildt,Herbert.TurboC/C++ManualdeReferencia,1eraEd.,1988.

Enelsiguientecapituloseestudianlasaplicacionesdelaspilascomountipodedato
bastante empleado, se presentan los programas y losalgoritmosempleados para su
manejo,ademasderepresentarsufuncionamiento.

Ing. Wagner E. Vicente Ramos

LISTAS

UNIDAD ACADMICA N 2
NOMBRE:__________________________________________________________________
APELLIDOS:________________________________________FECHA____/_____/______
CIUDAD:_______________________________SEMESTRE:_________________________

1. Dadadoslistasenlazadasordenadas,combinarlasenunasolalistaordenada.Lanueva
listaordenadareemplazaalaslistasanteriores.
2. Escriba en Java un mtodo INVERTIR(L), que dada un lista L devuelve a L con sus
elementosenelordeninversoalqueestaban.
3. Disear unaclase ListadeLibros, que permita efectuar la gestin de una biblioteca. La
clase ListadeLibros representa un array unidimensional cuyos elementos son listas
enlazadas ordenadas de la clase ListaOrdenadaGenerica y tendr mtodos para
efectuarelalmacenamiento,recuperacinyeliminacindelos libros.
LoslibrossealmacenanporinicialdettuloeISBN.Lainicialdelttulo (a z)determina
laposicinenelarrayunidimensionaldondesercolocado ellibro.Comocadaelemento
delarrayesunaListaOrdenadaGenerica,loslibrosquecomiencenporlamismainicial
sernsituadosenlacorrespondientelista enlazadaordenadosporISBN.
4. Realiceunprogramaquemantengaunalistadenombresdealumnos,yparacadauno
deellosunalistaconlOsnmerosdecdigodelasmateriasquehacursado,yotralista
conloscdigosdelasmateriasquehaaprobado.Elprogramadeberpermitirlacarga
denuevasmateriascursadasyaprobadas,verificandoquenoestnyacargadasenla
lista. En el caso de las materias aprobadas deber verificar adems que stas hayan
sidocursadas.

Ing. Wagner E. Vicente Ramos

Potrebbero piacerti anche