Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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
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
}
//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)
{
//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
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.
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
}
}
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)
}
}
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:
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.
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.
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.