Programación III, Guía 3 1 Facultad : Ingeniería Escuela : Computación Asignatura: Programación III Tema: “Listas enlazadas”. Objetivos Aprenda a formar estructuras de datos enlazadas Implemente una lista utilizando Visual C#.Net Introducción LISTA Una lista esta formada por una serie de elementos llamados nodos los cuales son objetos que contiene como variable miembro un puntero asignado y variables de cualquier tipo para manejar datos. El puntero sirve para enlazar cada nodo con el resto de nodos que conforman la lista. De esto podemos deducir que una lista enlazada (lista) es una secuencia de nodos en el que cada nodo esta enlazado o conectado con el siguiente (por medio del puntero mencionado anteriormente). El primer nodo de la lista se denomina cabeza de la lista y el último nodo cola de la lista. Este último nodo suele tener su puntero igualado a NULL Para indicar que es el fin de la lista. La lista enlazada es una estructura de datos dinámica cuyos nodos suelen ser normalmente registros y que tienen un tamaño fijo. Ahora bien suelen llamarse estructuras dinámicas porque se crean y destruyen según se vayan necesitando. De este modo se solicita o libera memoria en tiempo de ejecución del programa. Gráficamente una Lista puede representarse de la siguiente manera: Ivestigar que significa sistemas informáticos en cloud 2 Programación III, Guía 3 Prácticamente todos los programas reales incluyen alguna sentencia condicional, haciendo que las sentencias efectivamente ejecutadas dependan de los datos concretos que se le presenten. Esto hace que mas que un valor T(N) debamos hablar de un rango de valores Tmin(N) <=T(N) <= Tmax(N) Los extremos son habitualmente conocidos como “caso peor” y “caso mejor”. Entre ambos se hallara algun “caso promedio” o más frecuente. Cualquier fórmula T(N) incluye referencias al parámetro N y a una serie de constantes “Ti” que dependen de factores externos al algoritmo como pueden ser la calidad del código generado por el compilador y la velocidad de ejecución de instrucciones del ordenador que lo ejecuta. Dado que es fácil cambiar de compilador y que la potencia de los ordenadores crece a un ritmo vertiginoso (en la actualidad, se duplica anualmente), intentaremos analizar los algoritmos con algún nivel de independencia de estos factores; es decir, buscaremos estimaciones generales ampliamente válidas. Con frecuencia nos encontraremos con que no es necesario conocer el comportamiento exacto, sino que basta conocer una cota superior, es decir, alguna función que se comporte “aun peor”. La definición matemática de estos conjuntos debe ser muy cuidadosa para involucrar ambos aspectos: identificación de una familia y posible utilización como cota superior de otras funciones menos malas: Dícese que el conjunto O(f(n)) es el de las funciones de orden de f(n), que se define como: O(f(n)) ={g:INTEGER-> REAL tales que Existen las constantes k y N0 tales que Para todo N>N0, g(N) <=K*F(N) } En palabras, O(f(n)) esta formado por aquellas funciones g(n) que crecen a un ritmo menor o igual que el de f(n). De las funciones “g” que forman este conjunto O(f(n)) se dice que “estan dominadas asintóticamente” por “f” en el sentido de que para N suficientemente grande, y salvo una constante multiplicativa “K”,f(n) es una cota superior de g(n). Órdenes de Complejidad La familia O(f(n)) define un Orden de Complejidad. Elegiremos como representante de este Orden de Complejidad a la función f(n) más sencilla perteneciente a esta familia.: Se identifica una Jerarquía de Ordenes de Complejidad que coincide con el orden de la tabla mostrada; jerarquía en el sentido de que cada orden de complejidad inferior tiene a las superiores como subconjuntos. Si un algoritmoA se puede demostrar de un cierto orden O(1), es cierto que también pertenece a todos los ordenes superiores( la relación de orden cota superior es transitiva)l pero en la practica lo útil es encontrar la “menor cota superior”, es decir el menor orden de complejidad que lo cubra. Reglas Prácticas Aunque no existe una receta que siempre funcione para calcular la complejidad de un algoritmo, si es posible tratar sistemáticamente una gran cantidad de ellos, basándonos en que suelen estar bien estructurados y siguen pautas uniformes. Los algoritmos bien estructurados combinan las sentencias de alguna de las formas siguientes: Secuencia (;) Programación III, Guía 3 3 Las operaciones típicas de la lista incluyen: Crear la lista, verificar si esta vacía, insertar elementos, eliminar elementos, mostrar elementos. MATERIAL Y EQUIPO Nº Cantidad Descripción 1 1 Guía de Programación #3, Programación III 2 1 Dispositivo de memoria PROCEDIMIENTO 1- Cree un proyecto modo consola en Visual C#.Net y agregue el siguiente código dentro de la clase programa //se crea la clase nodo class nodo { public int info; public nodo sgte; } //se crea la clase lista class lista { public nodo inicio; public lista() { inicio = null; } Ivestigar que significa sistemas informáticos en cloud 4 Programación III, Guía 3 //Funcion insertar final de la lista public void Insertarf(int item) { nodo aux = new nodo(); aux.info = item; aux.sgte = null; if (inicio == null) inicio = aux; else { nodo puntero; puntero = inicio; while (puntero.sgte != null) { puntero = puntero.sgte; } puntero.sgte = aux; } } //Funcion insertar Inicio de la lista public void InsertarI(int item) { nodo aux = new nodo(); aux.info = item; aux.sgte = null; if (inicio == null) inicio = aux; else { nodo puntero; puntero = inicio; inicio = aux; aux.sgte = puntero; } Programación III, Guía 3 } //Funcion Eliminar inicio de la lista public void eliminarI() { if (inicio == null) Console.WriteLine("Lista vacía, no se puede eliminar"); else inicio = inicio.sgte; } //Funcion Eliminar final de la lista public void eliminarF() { if (inicio == null) Console.WriteLine("Lista vacía, no se puede eliminar"); else if (inicio.sgte == null) inicio = null; else { nodo punteroant, punteronext; punteroant = inicio; punteronext = inicio; while (punteronext.sgte != null) { punteroant = punteronext; punteronext = punteronext.sgte; } punteroant.sgte = null; } } Ivestigar que significa sistemas informáticos en cloud 5 Programación III, Guía 3 6 //Insertar en una posición especifica de la lista public void InsertarP(int item, int pos) { nodo aux = new nodo(); aux.info = item; aux.sgte = null; if (inicio == null) { Console.WriteLine(" LISTA VACIA,SE INSERTA EN LA 1ºPOSICION"); inicio = aux; } else { nodo puntero; puntero = inicio; if (pos == 1) { inicio = aux; aux.sgte = puntero; } else { for (int i = 1; i < pos - 1; i++) { puntero = puntero.sgte; if (puntero.sgte == null) break; } nodo punteronext; punteronext = puntero.sgte; puntero.sgte = aux; aux.sgte = punteronext; Programación III, Guía 3 } } } //Funcion que muestra el contenido de la lista public void Mostrar() { if (inicio == null) Console.WriteLine("lista vacia"); Else { nodo puntero; puntero = inicio; Console.Write("{0}->\t", puntero.info); while (puntero.sgte != null) { puntero = puntero.sgte; Console.Write("{0}->\t", puntero.info); } Console.WriteLine(); } } } Ivestigar que significa sistemas informáticos en cloud 7 Programación III, Guía 3 8 static void Main(string[] args) { //crear una instancia de la lista lista milista = new lista(); milista.Insertarf(10); milista.Insertarf(20); milista.Insertarf(30); milista.Insertarf(40); milista.Mostrar(); Console.ReadLine(); //insertamos en la posicion 2 el valor 220 milista.InsertarP(220, 2); milista.Mostrar(); Console.ReadLine(); } 2- Elabore un menú con las siguientes opciones: a. Insertar al Frente b. Insertar al Final c. Insertar en una posición especifica d. Eliminar al Frente e. Eliminar al Final f. Mostrar lista g. Salir 3- Utilizando el código del ejemplo1, cree un nuevo programa en C# en el que cree una lista que contenga la siguiente información ID Nombre Sueldo Agregando el menú del ejercicio 2 Programación III, Guía 3 9 Investigación complementaria. Crear una función booleana que permita buscar información en una lista enlazada, utilice la forma más sencilla del nodo solo el int info Ivestigar que significa sistemas informáticos en cloud