Programación III. Guía 4. 1 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación III Tema: “LISTAS ENLAZADAS”. Objetivos Específicos • Aprender a formar estructuras de datos enlazadas por medio de clases. • Implementar una lista utilizando Visual C#. NET. Introducción Teórica LISTA Una lista está 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: Programación III. Guía 4. 2 2 Las operaciones típicas de la lista incluyen: Crear la lista, verificar si está vacía, insertar elementos, eliminar elementos, mostrar elementos. Dependiendo cuatro tipos: de cómo se enlacen o comuniquen los nodos de las listas, estas se agrupan en Listas simplemente enlazadas Listas doblemente enlazadas Listas simplemente circulares Listas doblemente circulares Las listas simplemente enlazadas, permiten recorrer la lista en un solo sentido y desde la cabeza hasta la cola. Las listas doblemente enlazadas, permiten el recorrido en dos direcciones, de la cabeza a la cola y de la cola hacia la cabeza. Las listas simplemente circulares, permiten el recorrido en una dirección pero al llegar al último nodo (cola) este se encuentra comunicado o enlazado a la cabeza, haciendo un anillo o circulo si se representa gráficamente. Las listas doblemente circulares, permiten el recorrido en ambas direcciones y la cabeza y cola se encuentran conectadas en ambas direcciones. Las listas son la estructura (TAD) más básica, permite mayor versatilidad en los métodos y sirve de base para otras estructuras. Por ello es conveniente comprender completamente las listas pues su lógica es fundamental para otros TAD. Materiales y equipo • Guía de Laboratorio Nº 4. • Computadora con programa: Microsoft Visual Studio C# • Dispositivo de Almacenamiento (USB). Procedimiento 1-Cree un proyecto modo consola en Visual C# y agregue el siguiente código dentro de la clase program (antes del main). //se crea la clase nodo class nodo { public int info; public nodo sgte; Programación III. Guía 4. 3 3 } //se crea la clase lista class lista { public nodo inicio; public lista() { inicio = null; } //Función 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; } } //Función insertar Inicio de la lista public void InsertarI(int item) { nodo aux = new nodo(); aux.info = aux.sgte = if (inicio inicio = else item; null; == null) aux; { nodo puntero; puntero = inicio; inicio = aux; aux.sgte = puntero; } } //Función Eliminar inicio de la lista public void eliminarI() Programación III. Guía 4. 4 4 { if (inicio == null) Console.WriteLine("Lista vacía, no se puede eliminar"); else inicio = inicio.sgte; } //Función 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; } } //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; } Programación III. Guía 4. 5 5 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; } } } //Función 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(); } } Ahora dentro del Main digitaremos lo siguiente: 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(); } Programación III. Guía 4. 6 6 Ahora ejecute el código trabajado y observe lo que realiza el programa. Una vez que ha realizado esto agregue las siguientes líneas a su código del Main: //insertamos en la posicion 2 el valor 220 milista.InsertarP(220, 2); milista.Mostrar(); Console.ReadLine(); Ejecútelo y observe qué resultados muestra. Análisis de Resultados 1- Basándose en el código dado, 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 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. Implementar una lista doblemente enlazada con C#, apoyándose en el código visto en la práctica. Investigar sobre funcionalidades, herramientas y otros beneficios que ofrece la librería Drawing de C# (modo gráfico), también incluya ejemplos de ello. Nota: esto es requisito para próximas prácticas. Bibliografía. Deitel, Harvey M.; Deitel, Paul J. CÓMO PROGRAMAR EN C#. Segunda Edición. Editoral Pearson. México, 2007.