UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros. Procedimientos para asignación y liberación de memoria. Tipos de datos recursivos. Listas enlazadas con punteros. Pilas. Colas. UNIDAD 8 Estructuras Dinámicas de Datos Estructuras cuyo tamaño (en longitud o en numero de elementos) varia en el tiempo de ejecución. UNIDAD 8 Lista Enlazada Simple Cada nodo contiene un único enlace que conecta ese nodo al nodo siguiente o nodo sucesor. UNIDAD 8 Lista Enlazada Doble Cada nodo contiene dos enlaces, uno a su nodo predecesor y el otro a su nodo sucesor. UNIDAD 8 Lista Circular Simplemente Enlazada Una lista enlazada simplemente en la que el último elemento se enlaza al primer elemento (cabeza) de tal modo que la lista puede ser recorrida de modo circular. UNIDAD 8 Lista Circular Doblemente Enlazada Una lista doblemente enlazada en la que el ultimo elemento se enlaza al primer elemento y viceversa. Esta lista se puede recorrer de modo circular. UNIDAD 8 Lista Enlazada Simple UNIDAD 8 Lista Enlazada Simple: Definición NODO Colección o secuencia de elementos dispuestos uno detrás de otro, en la que cada elemento se conecta al siguiente elemento por un «enlace» o «puntero» UNIDAD 8 Lista Enlazada Simple: Nodo - Contiene la información que queremos almacenar en la lista. - Almacena un dato de cualquier tipo. - Es un puntero que apunta al siguiente elemento en la lista. UNIDAD 8 Lista Enlazada Simple: Nodo Vamos a representar un nodo mediante una estructura con dos campos: Campo valor: Para almacenar el elemento de la lista. Campo sgte: Puntero que permite el acceso al siguiente elemento de la lista. struct nodo{ tipo_de_dato valor; struct nodo* sgte; } UNIDAD 8 Lista Enlazada Simple: Ejemplo struct nodo{ Ejemplo: Lista de elementos enteros. int valor; struct nodo* sgte; a) La lista tiene elementos: }; typedef struct nodo NODO; Necesitamos un puntero que indique el inicio de la lista. El puntero siguiente del último elemento debe indicar el fin de la lista = NULL. UNIDAD 8 Lista Enlazada Simple: Ejemplo Ejemplo: Lista de elementos enteros. b) La lista no tiene elementos: struct nodo{ int valor; struct nodo* sgte; }; typedef struct nodo NODO; El inicio no apunta a nadie = NULL. UNIDAD 8 Lista Enlazada Simple: Operaciones Inicializar lista Agregar un elemento en la lista Mostrar lista Operaciones Lista vacía? Cantidad de elementos de la lista Buscar un elemento en la lista Eliminar un elemento de la lista Lista Enlazada Simple: Inicializar Deseamos inicializar la lista en vacío. main(){ Indica el inicio de la lista NODO* ini; inicializar(&ini); } El modulo inicializar tiene un parámetro: inicio que recibe la dirección de la variable ini. Puntero que apunta a un NODO: NODO* inicio inicio Que además será modificado: NODO* *inicio UNIDAD 8 Lista Enlazada Simple: Inicializar RAM ini =*inicio NULL inicio 101 101 El modulo debe asignar NULL a ini, lo que equivale a hacer *inicio=NULL. UNIDAD 8 Lista Enlazada Simple: Agregar Ordenada INSERCION Al inicio de la lista. Al final de la lista. Desordenada Antes de un elemento. Después de un elemento. Agregar al Inicio Deseamos insertar el elemento llamado elem en la lista enlazada. Como las inserciones se realizaran al inicio de la lista, la variable ini se modificara. main(){ NODO* ini; scanf(«%i»,&elem); agregar(&ini, elem); } El modulo agregar tiene dos parámetros: El inicio de la lista, que recibe la dirección de ini y será modificado: NODO* *inicio; El elemento a insertar: int e; UNIDAD 8 Agregar al Inicio: Casos Agregar en lista vacía: Inicio contiene NULL 1. Gestionar espacio para almacenar un nuevo nodo. RAM ini =*inicio 101 NULL *nuevo inicio 1101 elem 101 nuevo 7 e 1101 7 UNIDAD 8 Agregar en lista vacía 1. Gestionar espacio para almacenar un nuevo nodo. 2. Asignar valores al nuevo nodo. RAM ini =*inicio 101 NULL 1101 *nuevo 7 inicio NULL elem 101 nuevo 7 e 1101 7 UNIDAD 8 Agregar en lista vacía 1. Gestionar espacio para almacenar un nuevo nodo. 2. Asignar valores al nuevo nodo. 3. Actualizar el inicio de la lista. RAM ini =*inicio 101 NULL 1101 1101 *nuevo 7 inicio NULL elem 101 nuevo 7 e 1101 7 UNIDAD 8 Agregar en lista no vacía 1. Gestionar espacio para almacenar un nuevo nodo. RAM 100 ini =*inicio -1 101 *nuevo 110 100 1010 1000 7 inicio NULL elem 101 nuevo 110 1010 1000 3 4 e 4 UNIDAD 8 Agregar en lista no vacía 1. Gestionar espacio para almacenar un nuevo nodo. 2. Asignar valores al nuevo nodo. RAM 100 ini =*inicio -1 101 *nuevo 4 100 1010 110 100 1000 7 inicio NULL elem 101 nuevo 1010 1000 3 4 e 110 4 UNIDAD 8 Agregar en lista no vacía 1. Gestionar espacio para almacenar un nuevo nodo. 2. Asignar valores al nuevo nodo. 3. Actualizar el inicio de la lista. RAM 100 ini =*inicio -1 101 *nuevo 4 100 110 1010 110 100 1000 7 inicio NULL elem 101 nuevo 1010 1000 3 4 e 110 4 UNIDAD 8 Lista Enlazada: Agregar al incio UNIDAD 8 Lista Enlazada Simple: Agregar Ordenada INSERCION Al inicio de la lista. Al final de la lista. Desordenada Antes de un elemento. Después de un elemento. UNIDAD 8 Agregar al Final Deseamos insertar, al final de la lista, el elemento llamado elem. Es posible que la variable ini sea modificada. main(){ NODO* ini; scanf(«%i»,&elem); agregar(& ini, elem); } El modulo agregar tiene dos parámetros: El inicio de la lista, que recibe la dirección de ini y puede ser modificado: NODO* *inicio; El elemento a insertar: int e; UNIDAD 8 Agregar al Final: Casos UNIDAD 8 Agregar al Final UNIDAD 8 Lista Enlazada Simple: Agregar Ordenada INSERCION Al inicio de la lista. Al final de la lista. Desordenada Antes de un elemento. Después de un elemento. UNIDAD 8 Agregar Ordenado Deseamos insertar el elemento llamado elem en la lista enlazada de manera ordenada. La variable ini podrá ser modificada. main(){ NODO* ini; scanf(«%i»,&elem); agregar(&ini, elem); } El modulo agregar tiene dos parámetros: El inicio de la lista, que recibe la dirección de ini y será modificado: NODO* *inicio; El elemento a insertar: int e; UNIDAD 8 Agregar Ordenado: Casos UNIDAD 8 Agregar Ordenado: Casos ant NULL i UNIDAD 8 Agregar Ordenado: Casos ant i UNIDAD 8 Agregar Ordenado: Casos ant i UNIDAD 8 Agregar Ordenado: Casos ant i NULL UNIDAD 8 Agregar Ordenado: Casos UNIDAD 8 Agregar Ordenado: Casos UNIDAD 8 Agregar Ordenado UNIDAD 8 Lista Enlazada: Mostrar Deseamos mostrar los elementos de la lista enlazada, por lo que se recorre la lista partiendo del inicio indicado por ini. main(){ NODO* ini; mostrar( ini); } El modulo mostrar tiene un parámetro: El inicio de la lista, que recibe la dirección de ini: NODO* inicio; UNIDAD 8 Mostrar la lista i = inicio; Si (i != NULL) printf (“%i”, i->dato); ó Si (i != NULL) printf (“%i”, (* i). dato); i UNIDAD 8 Mostrar la lista i=i->sgte; printf (“%i”, i->dato); Ó i=(*i).sgte; printf (“%i”, (* i). dato); i UNIDAD 8 Mostrar la lista i=i->sgte; printf (“%i”, i->dato); Ó i=(*i).sgte; printf (“%i”, (* i). dato); i UNIDAD 8 Mostrar la lista i es NULL , fin de la lista !! i NULL UNIDAD 8 Lista Enlazada: Mostrar 1. Ubicarse al inicio de la lista. RAM 100 ini =*inicio -1 101 110 4 110 1010 100 1000 7 NULL inicio 1010 110 3 i 110 1000 UNIDAD 8 Lista Enlazada: Mostrar 1. Ubicarse al inicio de la lista. 2. Recorrer la lista, mostrando sus elementos, hasta el final. RAM 100 ini =*inicio -1 101 110 4 110 1010 100 Mostrar 4 1000 7 NULL inicio Mostrar 3 1010 3 110 i 1010 110 NULL 1000 100 1000 Mostrar -1 Mostrar 7 UNIDAD 8 Lista Enlazada: Mostrar UNIDAD 8 Lista Enlazada: Eliminar Deseamos eliminar un elemento llamado elem de la lista enlazada. Es posible que la variable ini sea modificada. main(){ NODO* ini; scanf(«%i»,&elem); eliminar(& ini, elem); } El modulo eliminar tiene dos parámetros: La dirección del inicio de la lista, que podrá ser modificada: NODO* *inicio; El elemento a eliminar: int e; UNIDAD 8 Eliminar: Casos NULL UNIDAD 8 Eliminar: Casos UNIDAD 8 Lista Enlazada: Eliminar