You are on page 1of 12

Universidad Don Bosco Facultad de Ingeniera Escuela de Computacin

OBJETIVO. En esta unidad se estudiar la importancia de las listas, pilas y colas y como estas son necesarias para la programacin estructurada y orientada a objetos. Ya que estas estructuras nos ayudan a implementar aplicaciones que son utilizadas en los sistemas operativos modernos y en el estudio de problemas bancarios.

Listas eslabonadas
Definicin: Coleccin de elementos o nodos en que cada uno est formado de dos partes: La primera hace referencia a los datos (Data o Informacin) y la segunda se refiere al enlace (Constructor al siguiente elemento de la lista) Algunos sinnimos con los que se conocen las listas son los siguientes: listas enlazadas, listas eslabonadas. Grficamente:

Caractersticas: 1. Debe de haber un puntero enlace externo que seale el inicio de la lista (List). 2. No pueden accesarse aleatoriamente a los nodos de una lista eslabonada. 3. El ltimo nodo tiene como enlace un valor nulo. 4. La lista que no contiene nodo se denomina lista vaca o lista nula (List =Null). Las operaciones que podemos realizar sobre una lista enlazada son las siguientes: Recorrido. Esta operacin consiste en visitar cada uno de los nodos que forman la lista. Para recorrer todos los nodos de la lista, se comienza con el primero, se toma el valor del campo liga para avanzar al segundo nodo, el campo liga de este nodo nos dar la direccin del tercer nodo, y as sucesivamente. Insercin. Esta operacin consiste en agregar un nuevo nodo a la lista. Para esta operacin se pueden considerar tres casos: o Insertar un nodo al inicio. o Insertar un nodo antes o despus de cierto nodo. o Insertar un nodo al final

Borrado. La operacin de borrado consiste en quitar un nodo de la lista, redefiniendo las ligas que correspondan. Se pueden presentar cuatro casos: o Eliminar el primer nodo. o Eliminar el ltimo nodo. o Eliminar un nodo con cierta informacin. o Eliminar el nodo anterior o posterior al nodo cierta con informacin. Bsqueda. Esta operacin consiste en visitar cada uno de los nodos, tomando al campo liga como puntero al siguiente nodo a visitar. Criterios para definir tipos de lista. Orden de los elementos: o Ascendentes o Descendentes Acceso a la lista o direccionamiento: o Unidireccional o Bidireccional Representacin de algoritmos listas: 1- Lista ordenada ascendente-unidireccional

2- Lista ordenada descendente- unidireccional

3- Combinacin 1 y 2

4- Listas circular

Insercin y remocin de nodo de una lista

Agregar 6 al frente de la Lista

Remover el primer nodo de una lista

La lista eslabonada como estructura de datos. Operacin de Insercin de nodos

Nuevo Nodo con Info=X Insafter (P,X) (Agrega un nuevo Nodo)

Algoritmo: Insafter (p, x) /* Inserta un nuevo nodo*/ q= getnodo (); Info (q)= x; Next(q)= Next (p); next (p)= q;

Operacin de eliminacin de nodos Algoritmo: Delafter (p, x) q= next (); x= info (q); next (p)= next (q); freenode (q);

Listas doblemente enlazadas En algunas aplicaciones podemos desear recorrer la lista hacia adelante y hacia atrs, o dado un elemento, podemos desear conocer rpidamente los elementos anterior y siguiente. En tales situaciones podramos desear darle a cada celda sobre una lista un puntero a las celdas siguiente y anterior en la lista tal y como se muestra en la figura.

El nico precio que pagamos por estas caractersticas es la presencia de un puntero adicional en cada celda y consecuentemente procedimientos ms largos para algunas de las operaciones bsicas de listas. Implementacin de listas doblemente Enlazadas Respecto a la forma en que trabajarn las funciones de la implementacin que proponemos hay que hacer constar los siguientes puntos: La funcin posicin retorna la direccin de memoria del ltimo nodo de la lista, si es que no se ha encontrado, porque de ser as retorna la posicin a donde lo encuentra. Adems es de hacer notar que la funcin busca hasta el fin la lista o hasta encontrar el elemento.

La funcin de insercin adiciona el nuevo nodo al final de la lista, pero si es encontrado se inserta justo despus, crendose un duplicado. La funcin considera los casos de insertar al principio, en medio y al final de la lista. La funcin de Borrar elimina el nodo apuntado por un parmetro, encontrado por la funcin posicin. Igualmente considera la eliminacin al inicio, en medio y al final de la lista. Listas doblemente enlazadas circulares. Para obviar los problemas derivados de los elementos extremos (primero y ltimo) es prctica comn hacer que la cabecera de la lista doblemente enlazada sea una celda que efectivamente complete el crculo, es decir, el anterior a la celda de cabecera sea la ltima celda de la lista y la siguiente la primera. De esta manera no necesitamos chequear para NULL al final o inicio de la lista. Por consiguiente, podemos realizar una implementacin de listas doblemente enlazadas con cabecera tal que tenga una estructura circular en el sentido de que dado un nodo y por medio de los punteros siguiente podemos volver hasta l como se puede observar en la figura (de forma anloga para anterior).

Es importante notar que aunque la estructura fsica de la lista puede hacer pensar que mediante la operacin siguiente podemos alcanzar de nuevo un nodo de la lista, la estructura lgica es la de una lista y por lo tanto habr una posicin primero y una posicin fin de forma que al aplicar una operacin anterior o siguiente respectivamente sobre estas posiciones el resultado ser un error. Respecto a la forma en que trabajarn las funciones de la implementacin que proponemos hay que hacer constar los siguientes puntos: La funcin de creacin debe alojar memoria para la cabecera y hacer que los punteros siguiente y anterior apunten a ella, devolviendo un puntero a dicha cabecera. La funcin primero(l) devolver un puntero al nodo siguiente a la cabecera. La funcin fin(l) devolver un puntero al nodo cabecera. En la implementacin final optaremos por pasar un puntero a la posicin para el borrado de forma que la posicin usada quede apuntando al elemento siguiente que se va a borrar al igual que ocurra en el caso de las listas simples.

La insercin se har a la izquierda del nodo apuntado por la posicin ofrecida a la funcin insertar. Esto implica que al contrario que en las listas simples, al insertar un nodo, el puntero utilizado sigue apuntando al mismo elemento al que apuntaba y no al nuevo elemento insertado.

EJEMPLOS Y EJERCICIOS Detallaremos la clase nodo para ejemplificar lo antes expuesto.


Class nodo { Private int datos; //guarda datos enteros Private nodo siguiente. // almacena referencia al siguiente nodo Public node (int valordatos) { Se construye el constructor } Public int datos { Get { Cuerpo del get } Set { Cuerpo del set } } public nodo siguiente { Get { Cuerpo del get } Set { Cuerpo del set } } }

Como vern existen comandos extraos, get y set son palabra reservada de csharp, es un miembro de clase de tipo propiedad, una propiedad combina un campo con los mtodos que tienen acceso al mismo; estos se parecen a los indicadores. Una propiedad consiste en un nombre adems de los descriptores de acceso get y set. Los descriptores de acceso se utilizan para obtener y definir el valor de una variable. La principal ventaja de una propiedad es que su nombre se puede utilizar en expresiones y asignaciones, tanto get y set se invocan de forma automtica. Para comprender mejor lo anterior observemos el siguiente ejemplo.
using System; class simpProp { int prop; // campo que se administrar mediante miprop public simpProp() { prop = 0;

} /*Propiedad que permite tener acceso a la variable de instancia privada prop. Slo * permite valores positivos*/ public int miprop { get { return prop; } set { if(value >= 0)prop = value; } } } // Mostrando el uso de una propiedad class demostracin { public static void main() { simpProp ob = new simpProp(); Console.WriteLine("Valor original de ob.miprop: " + ob.miprop); ob.miprop = 100; //asignacin de un valor Console.WriteLine("Valor de ob.miprop:" + ob.miprop); //No se puede asiganar un valor negativo a prop Console.WriteLine("Se intenta asignar -10 a ob.miprop"); ob.miprop = -10; Console.WriteLine("Valor de ob.mirpop:" + ob.miprop); } }

La salida del programa sera: Valor original de ob.miprop: 0 Valor de ob.miprop : 100 Se intenta asingar -10 a ob.miprop Valor de ob.miprop: 100

using System; namespace BibliotecaListasEnlazdas { private objetc datos; //almacena los datos para este nodo private nodolista siguiente; //almacena una referencia al siugiente nodo { public nodolista(object valordatos): this(valordatos,null) { // se crea un constructor predeterminado por el csharp } public nodolista(object valordatos, nodolista siguientenodo) { datos = valordatos; siguiente = siguientenodo; } public nodolista siguiente { get { return siguiente; } set siguiente = value;

} } public obect datos { get { return datos; } //declaracin de la lista. public class lista { private nodolista primer nodo; private nodolista ultimonodo; private string nombre; //cadena a mostrar, tal com "lista" public lista(string nombrelista) { nombre = nombrelista; primernodo = ultimonodo = null; } public lista():this("lista") { // se crea un constructor predeterminado } public void insertaralfrente(object insertarelemento) { if (estavicia()) primernodo = ultimonodo = new nodolista(insertarelemento); else primernodo = new nodolista(insertarelemento, primernodo); } public void insertaralfinal(object insertarelemento) { if (estavacia()) primernodo = ultimonodo = new nodolista(insertarelemento); else ultimonodo = ultimonodo.siguiente = new nodoslista(insertarelemento); }

Hasta este punto, hemos creado los nodos de la lista enlazada, de igual manera le insertamos nuevos nodos para que esta crezca, se est insertando elemento en cada nodo de la lista con la finalidad de tener ambas estructuras. Un punto importante en todos las aplicaciones de listas, pilas y colas es el poder eliminar tanto elementos o nodos. A continuacin veamos cmo se eliminan en una lista.

public object eliminandodelfrente() { if (estavacia()) trhow new Excepciolistavacia (nombre); object eliminarelemento = primernodo.datos; // recupera los datos if (primernodo == ultimonodo) primernodo = ultimonodo = null; else primernodo = primernodo.siguiente; return eliminarelemento; } public object eliminaralfinal() { if(estavacia()) throw new Exceptionlistavacia(nombre); object eliminarelemento = ultimonodo.datos; //obtiene los datos if (primernodo == ultimonodo) primernodo = ultimono = null; else

{ nodolista actual = primernodo; while (actual.siguietne != ultimonodo) actual = actual.siguiente; ultimonodo = actual; actual.siguiente = null; } return eliminarelemento; }

En estos cdigos podemos ver como se eliminan tanto los nodos como los elementos de una lista enlazada. Cmo haramos para conocer si una lista est vaca o no?, bien esto lo realizamos de la siguiente manera.

public bool estavacia() { return primernodo = null; } public void imprimir() { if (estaviacia()) { Console.WriteLine(nombre + "vacia"); return; } Console.WriteLine("La" + nombre + "es: "); nodolista actual = primernodo; while (actual != null) { Console.WriteLine(actal.datos + " "); actual = actual.siguiente; }

En una primera parte se ha desarrollado la parte de la verificacin de la lista vaca, mientras que esta no este vaca se ejecutaran un segundo grupo de instrucciones, los cuales tiene la funcin de imprimir el contenido de la lista. La clase excepcin se utiliza en este caso para determinar operaciones ilegales en la lista.

public class excepcionlistavacia : ApplicationException { public excepcionlistavacia(string nombre): base (" La " + nombre + " est vacia") { //constructor por defecto } }

Con este pequeo cdigo podemos garantizar que no habr valores extraos en nuestra lista. Se ha creado una biblioteca de lista enlazada, en la cual se cuenta con todos los elementos necesarios para poder crear los nodos, insertar en ellos, eliminar el contenido de cada nodo e inclusive eliminar los nodos, de igual forma se verifica si la lista esta vaca o no y por ltimo

tenemos la parte de Excepciones en la cual nos verifica que no podamos tener valores que no correspondan a la lista.

Tarea, investigue en C#, lo que realizan las siguientes estructuras, this y throw.
Luego de haber estructurado las declaraciones de la clases nodolista y listas, los cuales se almacenaran con el nombre BibliotecaListasEnlazadas.cs. debemos de proceder a crear el programa principal o la estructura que llamara a cada una de los mtodos creados.
using System; using BibliotecaListasEnlazadas; class PruebaLista { static void Main(string[]args) { Lista lista = new lista(); //se crea la lista. //datos que se agregaran a la lista bool unBooleano = true; char unCaracter = '$'; int unEntero = 34567; string unaCadena = "HOLA A TODOS"; //usa los mtodos de insercin de la lista lista.InsertarAlFrente(unbooleano); lista.Imprimir(); lista.InsertarAlFrente(unCaracter); lista.imprimir(); lista.InsertarAlFinal(unEntero); lista.imprimir(); lista.InsertarAlFinal(unaCadena); lista.imprimir(); object objetoEliminado; try { objetoEliminado = lista.EliminarDellFrente(); Console.WriteLine(objetoEliminado + "eliminado"); lista.Imprimir(); objetoEliminado = lista.EliminarDelFrente(); Console.WriteLine(objetoEliminado + "eliminado"); lista.imprimir(); objetoEliminado = lista.EliminarDelFinal(); Console.WriteLine(objetoEliminado + "eliminado"); lista.imprimir(); obetoEliminado = lista.EliminarDelFinal(); Console.WriteLine(objetoEliminado + "eliminado"); lista.Imprimir(); } catch (ExcepcionListaVacia excepcionListaVacia) { Consloe.Error.WriteLine(+ excepcionListaVacia); } } }

El programa anterior hace uso de la BibliotecaListasEnlazadas, ya que en ella estn los mtodos que se ocuparan para insertar y eliminar un nodo e inclusive para almacenar datos, la corrida se muestra a continuacin.
La La La La lista lista lista lista es: es: es: es: Verdadera $ True $ True $ 34567 $ True 34567 HOLA A TODOS

$ eliminado La lista es: True 34567 HOLA A TODOS True eliminado La lista es: 34567 HOLA A TODOS HOLA A TODOS eliminado La lista es: 34567 34567 eliminado lista Vacia