Documente Academic
Documente Profesional
Documente Cultură
ASIGNATURA
TEMA
ESTRUCTURAS DE DATOS
LISTAS ENLAZADAS
Concepto Abstraccin
La abstraccin es un proceso mental mediante el cual se entiende que al conocer un
objeto, entonces se conocen todas sus caractersticas.
Por ejemplo, al nombrar el objeto Computador, entonces se sabe que con l se pueden
hacer programas, navegar en Internet, guardar informacin, y adems tiene tamao,
velocidad, memoria RAM, etc.
Al conocer el objeto, entonces se ABSTRAEN todas sus propiedades, funciones y
caractersticas.
Listas enlazadas
Es necesario entender primero que los arrays tienen algunas desventajas como:
En un array desordenado la bsqueda es lenta.
En un array ordenado la insercin es lenta.
En ambos casos, la eliminacin es lenta.
El tamao de un array no se puede cambiar despus de creado.
Estos problemas se solucionan con las estructuras de datos llamadas Lista Enlazada.
La Lista Enlazada es una estructura en la cual los elementos se almacenan de forma no
adyacente, en vez de un vector de posiciones de memoria consecutivas.
Una de las ventajas ms importantes de la Lista Enlazada es la optimizacin del uso de
memoria pues no se desperdicia el espacio de nodos vacos, como sucede como los
arrays, pues los arrays reservan el espacio de memoria aun cuando no la use.
Cada elemento de la lista enlazada se almacena en un NODO que contiene el objeto y una
referencia.
La mayor desventaja de la Lista Enlazada es que para localizar un dato especfico debe ser
recorrida desde el inicio, lo que quiere decir que no se puede ir al i-simo elemento como
se hace en un array.
Existen tres (3) tipos de listas:
1. Lista enlazada simple
2. Lista doblemente enlazada
3. Lista circular
Lista enlazada simple
Lista circular
En una lista enlazada circular, el primer y el ltimo nodo estn unidos. El ltimo nodo
apunta al primero.
EJERCICIO DE CLASE
Implemente el siguiente cdigo de lista enlazada en un programa que capture las notas
del primer corte de los estudiantes del curso.
Recuerde que el programa debe:
1. Capturar la nota de cada estudiante
2. Indicar la nota mxima
3. Indicar la nota mnima
4. Indicar el promedio de las notas
Pero es muy importante que analice el funcionamiento de los mtodos sobre la lista
enlazada.
//Esta es la clase Nodo;
public class Nodo {
//Atributos de la clase nodo
Object Dato;
Nodo Sig;
//Constructor del nodo para crear un objeto
public Nodo(Object Valor){
Dato=Valor;
Sig=null;
}
//Constructor del nodo para crear un objeto del siguiente nodo
public Nodo(Object Valor,Nodo Sign){
Dato=Valor;
Sig=Sign;
}
}
//Ahora la clase Lista
import javax.swing.JOptionPane;
public class Lista {
//Atributos de la lista
Nodo Pri;
Nodo Ult;
String Nom;
//Constructor de la lista
public Lista(String n){
Pri=Ult=null;
Nom=n;
}
5
//Constructor
public boolean ListaVacia(){//EN CASO DE QUE LA LISTA ESTE VACIA
if(Pri==null){
return true;
}
else{
return false;
}
}
//Nombre de la lista
public Lista(){
this("Lista");
}
//Metodo para insertar por el frente de la lista
public void Ifrente(Object Elem){
if(ListaVacia()){
Pri=Ult=new Nodo(Elem);
}
else{
Pri=new Nodo(Elem,Pri);
}
}
//Metodo para insertar por la parte posterior de la lista
public void Iposterio(Object Elem){
if(ListaVacia()){
Pri=Ult=new Nodo(Elem);
}
else{
Ult=Ult.Sig=new Nodo(Elem);
}
}
//Metodo para mostrar los datos de la lista
public void Mostrar(){
Nodo Actual=Pri;
if(ListaVacia()){
System.out.println("La "+Nom+" esta vacia");
}
while(Actual!=null){
System.out.println(Actual.Dato);
Actual=Actual.Sig;
}
}
//Metodo para eliminar el frente de la lista
public void Efrente(){
if(ListaVacia()){
Pri=Pri.Sig;
6
}
else if(Pri.equals(Ult)){
Pri=Ult=null;
}
else{
Pri=Pri.Sig;
}
}
//Metodo para eliminar el posterior de la lista
public void Eposterior(){
if(ListaVacia()){
Pri=Pri.Sig;
}
else if(Pri.equals(null)){
Ult=null;
}
else{
Pri=Pri.Sig;
}
}
}
PSEUDOCODIGOS
Empieza la lista de enlace simple
11
El puntero anterior del primer elemento debe apuntar hacia NULL (el inicio de la
lista).
El puntero siguiente del ltimo elemento debe apuntar hacia NULL (el fin de la
lista).
12
Agregar al inicio
public void agregaralinicio(String dato){
Nodo2 nuevo = new Nodo2(dato);
if(estaVacia()){
topehaciaadelante = nuevo;
topehaciaatras = nuevo;
} else {
topehaciaadelante.prev = nuevo;
nuevo.next = topehaciaadelante;
topehaciaadelante = nuevo;
}
}
Borrar al final
public void borraralfinal(){
if(estaVacia()){
System.out.println("Esta vaca");
} else {
Nodo2 ultimo = topehaciaatras.prev;
ultimo.next = null;
topehaciaatras = ultimo;
}
}
Borrar al inicio
public void borraralinicio(){
if(estaVacia()){
System.out.println("Esta vaca");
} else {
Nodo2 primero = topehaciaadelante.next;
primero.prev = null;
topehaciaadelante = primero;
}
}
Buscar un nodo
public String buscar(String dato){
Nodo2 buscado = null;
Nodo2 iterador = topehaciaadelante;
while(iterador != null && buscado == null){
if(iterador.name == dato){
buscado = iterador;
} else {
iterador = iterador.next;
}
}
return dato;
}
13
Las operaciones que se realizan sobre una lista circular son similares a las operaciones
sobre listas lineales, teniendo en cuenta que no hay primero ni ltimo nodo, aunque s un
nodo de acceso a la lista.
La construccin de una lista circular se puede hacer con enlace simple o enlace doble.
Analicemos el siguiente cdigo:
//Clase Nodo para la lista circular doblemente enlazada
public class Nodolc {
int info;
Nodolc ant,sig;
public void Nodolc(){
ant = null;
sig = null;
}
}
//lista circular doblemente enlazada
public class ListaCircular {
private Nodolc raiz;
public ListaCircular () {
raiz=null;
}
public void insertarPrimero(int x) {
Nodolc nuevo = new Nodolc();
nuevo.info=x;
if (raiz==null) {
nuevo.sig=nuevo;
nuevo.ant=nuevo;
raiz=nuevo;
} else {
Nodolc ultimo=raiz.ant;
nuevo.sig=raiz;
14
nuevo.ant=ultimo;
raiz.ant=nuevo;
ultimo.sig=nuevo;
raiz=nuevo;
}
}
public void imprimir ()
{
if (!vacia()) {
Nodolc reco=raiz;
do {
System.out.print (reco.info + "-");
reco = reco.sig;
} while (reco!=raiz);
System.out.println();
}
}
public void insertarUltimo(int x) {
Nodolc nuevo=new Nodolc();
nuevo.info=x;
if (raiz==null) {
nuevo.sig=nuevo;
nuevo.ant=nuevo;
raiz=nuevo;
} else {
Nodolc ultimo=raiz.ant;
nuevo.sig=raiz;
nuevo.ant=ultimo;
raiz.ant=nuevo;
ultimo.sig=nuevo;
}
}
public boolean vacia ()
{
if (raiz == null)
return true;
else
return false;
}
public int cantidad ()
{
int cant = 0;
if (!vacia()) {
Nodolc reco=raiz;
do {
cant++;
reco = reco.sig;
} while (reco!=raiz);
}
return cant;
}
public void borrar (int pos)
{
if (pos <= cantidad ())
if (pos == 1) {
15
if (cantidad()==1) {
raiz=null;
} else {
Nodolc ultimo=raiz.ant;
raiz = raiz.sig;
ultimo.sig=raiz;
raiz.ant=ultimo;
}
} else {
Nodolc reco = raiz;
for (int f = 1 ; f <= pos - 1 ; f++)
reco = reco.sig;
Nodolc anterior = reco.ant;
reco=reco.sig;
anterior.sig=reco;
reco.ant=anterior;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ListaCircular lc=new ListaCircular();
lc.insertarPrimero(100);
lc.insertarPrimero(45);
lc.insertarPrimero(12);
lc.insertarPrimero(4);
System.out.println("Luego de insertar 4 nodos al principio");
lc.imprimir();
lc.insertarUltimo(250);
lc.insertarUltimo(7);
System.out.println("Luego de insertar 2 nodos al final");
lc.imprimir();
System.out.println("Cantidad de nodos:"+lc.cantidad());
System.out.println("Luego de borrar el de la primer posicin:");
lc.borrar(1);
lc.imprimir();
System.out.println("Luego de borrar el de la cuarta posicin:");
lc.borrar(4);
lc.imprimir();
}
}
16