INGENIERIA DE SISTEMAS ESTRUCTURAS DE DATOS LISTAS

Anuncio
INGENIERIA DE SISTEMAS
ESTRUCTURAS DE DATOS
LISTAS ENLAZADAS CIRCULARES
Una lista circular es una lista lineal en la que el último nodo apunta al primero (no existe null).
cab
4
7
8
0
Al igual que en las listas enlazadas, para trabajar con listas circulares utilizaremos la clase Nodo, la clase
ListaC y la clase Prueba.
CLASE Nodo.
public class Nodo {
int info;
Nodo enlace;
public Nodo(int a)
{
info=a;
}
}
CLASE ListaC,
public class ListaC {
Nodo cab;
void insertar(int a){
if(cab==null){
cab=new Nodo(a);
cab.enlace=cab;
}
else{
Nodo temp=new Nodo(a);
Nodo aux=cab;
while(aux.enlace!=cab)
aux=aux.enlace;
aux.enlace=temp;
temp.enlace=cab;
}
}
void mostrar(){
if(cab!=null){
Nodo aux=cab;
do
{
System.out.print(aux.info+" ");
aux=aux.enlace;
}
while(aux!=cab);
}
}
}
INGENIERIA DE SISTEMAS
ESTRUCTURAS DE DATOS
CLASE Prueba
public class Prueba {
public static void main(String[] args) {
ListaC l=new ListaC();
l.insertar(1);
l.insertar(2);
l.insertar(3);
l.insertar(4);
l.insertar(5);
l.mostrar();
}
}
LISTAS DOBLEMENTE ENLAZADAS
Un tipo de lista enlazada más sofisticado es la lista doblemente enlazada o lista enlazada de dos vías. Cada
nodo tiene dos enlaces: uno apunta al nodo anterior, o apunta al valor NULL o a la lista vacía si es el primer
nodo; y otro que apunta al siguiente nodo siguiente, o apunta al valor NULL o a la lista vacía si es el último
nodo.
first (primer Nodo)
NULL
3
4
last (ultimo Nodo)
2
5
1
NULL
Un Nodo de una lista doblemente enlazada tiene tres campos
info
Anterior
3
Siguiente
La declaración de un Nodo de una lista doblemente enlazada en JAVA seria:
class Nodo {
int info;
Nodo siguiente,anterior;
//constructor
Nodo(int a)
{
info=a;
siguiente=anterior=null;
}
}
Para poder realizar acciones sobre la lista doblemente enlazada utilizaremos la clase Lista en la cual estarán
todas las funciones sobre la lista doblemente enlazada como. insertar, eliminar, mostrar, etc.
INGENIERIA DE SISTEMAS
ESTRUCTURAS DE DATOS
class Lista {
//first primer elemento, last ultimo elemento
Nodo first,last;
void insertar(int a)
{
//if no hay datos
if(first==null)
{
first=new Nodo(a);
last=first;
}
//si por lo menos hay un dato
else
{
//crea un nuevo nodo temp
Nodo temp=new Nodo(a);
last.siguiente=temp;
temp.anterior=last;
last=temp;
}
}
void mostrarAdelante()
{
Nodo aux=first;
while(aux!=null)
{
System.out.print(aux.info);
aux=aux.siguiente;
}
}
void mostrarAtras()
{
Nodo aux=last;
while(aux!=null)
{
System.out.print(aux.info);
aux=aux.anterior;
}
}
void insertarOrdenado(int a)
{
//si no hay nodos
if(first==null)
{
first=new Nodo(a);
last=first;
}
//si por lo menos hay un nodo
else
{
//creamos un nuevo nodo
Nodo temp=new Nodo(a);
//si el nodo a insertar es menor que el primer dato
if(temp.info<first.info)
{
temp.siguiente=first;
first.anterior=temp;
first=temp;
}
else
{
Nodo aux=first.siguiente;
INGENIERIA DE SISTEMAS
ESTRUCTURAS DE DATOS
Nodo antes=first;
while(aux!=null && temp.info>aux.info)
{
aux=aux.siguiente;
antes=antes.siguiente;
}
antes.siguiente=temp;
temp.anterior=antes;
if(aux!=null)
{
temp.siguiente=aux;
aux.anterior=temp;
}
else
last=temp;
}
}
}
}
A partir de estas clases podremos realizar cualquier programa:
public class prueba {
public static void main(String[] args) {
Lista l=new Lista();
l.insertarOrdenado(2);
l.insertarOrdenado(1);
l.insertarOrdenado(8);
l.insertarOrdenado(5);
l.insertarOrdenado(6);
l.insertarOrdenado(10);
l.insertarOrdenado(2);
l.mostrarAdelante();
System.out.println();
l.mostrarAtras();
}
}
Ejemplo.- programa que permite insertar ordenadamente N números por teclado en una lista doblemente
enlazada y posteriormente visualiza en forma invertida
import java.util.*;
public class prueba {
public static void main(String[] args) {
Scanner en=new Scanner(System.in);
Lista l=new Lista();
int N=en.nextInt();
for(int i=0;i<N;i++)
l.insertarOrdenado(en.nextInt());
l.mostrarAtras();
}
}
Descargar