Listas Cursos Propedéuticos 2015 Dr. René Cumplido M. en C. Luis Rodríguez Flores http://ccc.inaoep.mx/~rcumplido/ Contenido de la sección • Listas • Principales operaciones • Listas secuenciales vs Listas ligadas • Implementación en C • Otros tipos de listas Listas • Una lista es una secuencia finita, ordenada de datos. • Concepto importante: Los elementos de la lista tienen una posición. • Notación: <a0, a1, …, an-1> • ¿Qué operaciones se pueden implementar con esta estructura de datos? Listas • La posición actual de un elemento de la lista está dada por el símbolo |. • Ejemplo: – <20, 23 | 12, 15> • Los accesos a los datos de la lista se realizan con base en la posición de |. Lista como un TAD • Operaciones con listas void clear(List int insert(List int append(List int remove(List L); L, Element Item); L, Element Item); L, Element Item); void setStart(List L); void setEnd(List L); int setPos(List L, int pos); void prev(List L); void next(List L); int leftLength(List L); int rightLength(List L); int getValue(List L, Element Item); void print(Element Item); Ejemplos List: <12 | 32, 15> • insert(List, 99); – Result: <12 | 99, 32, 15> • Recorrer la lista: – setStart(List) – While(next(List)) • getValue(List, it); • print(it) Listas basadas en arreglos • Arreglos tienen una longitud fija. • Se requiere desplazar los elementos, cuando se agrega o cuando se elimina. Listas ligadas • Otra opción es usar apuntadores entre los elementos de la lista. – Cada elemento apunta al elemento siguiente. Listas ligadas • El modelo conceptual es como una “cadena” – Nuevos eslabones pueden insertarse al principio o al final, e incluso en cualquier otra posición con algo mas de esfuerzo. – Las extracciones pueden hacerse simplemente rompiendo la cadena y uniéndola nuevamente. • Gran ventaja: ¡es dinámica! – se usa únicamente el espacio necesario – No es necesario conocer de antemano que tan grande será el tamaño de la lista Listas ligadas • Las listas son adecuadas para el procesamiento secuencial ya que el siguiente elemento de la lista es accesible a partir del elemento actual. Dato Apuntador a1 a2 a3 a4 cabeza Celda básica o nodo • No son apropiadas donde se requiere acceso aleatorio a los elementos de la lista. – Implica un búsqueda lineal (lenta) • Los elementos de la lista NO necesariamente están en localidades de memoria adyacentes. Listas ligadas • Para tener acceso a la lista únicamente es necesario conocer la localidad de memoria donde comienza. Operaciones básicas de una LISTA • Insertar un nuevo elemento a la lista: ltemp = create_new(10); if (ltemp == NULL) return; Ltemp->next = fence->next; fence->next = Ltemp; if (tail == fence) tail = fence->next; Operaciones básicas de una LISTA • Eliminar: if (fence->next == NULL) return FALSE; ltemp = fence->next; // Remember link node fence->next = ltemp->next; // Remove if (tail == ltemp)// Reset tail tail = fence; delete ltemp; return TRUE; // Reclaim space Listas ordenadas • Son listas que mantienen los elementos en un orden específico (numérico o alfabético). • Siempre que se agrega un elemento, éste se coloca en la posición correcta. Implementación typedef struct node { typeData data; struct node *next; }Node; • Cada elemento de la lista consiste en un dato y de un apuntador al siguiente elemento. • El apuntador indica una dirección de memoria. NO es el índice de un arreglo. • Es necesario conocer la dirección del primer elemento. • El último elemento de la lista siempre apunta a NULL. Node* create_new(typeData d) { int size = sizeof(Node); Node* new=(Node*)malloc(size); if (new != NULL){ new->data = d; new->next = NULL; } return new; } Otros tipos de listas • Doblemente ligadas – Nodos con dos apuntadores, uno al siguiente elemento de la lista y otro al anterior. – Maximiza la capacidad de recorrido de la lista. – Las operaciones de inserción y eliminación son poco más costosas que en las listas simplemente ligadas, pues se tienen que actualizar los dos apuntadores. – El espacio de almacenamiento también es un poco mayor. Listas doblemente ligadas • Inserción Listas doblemente ligadas • Eliminar Otros tipos de listas (2) • Listas circulares – Similar a las doblemente ligadas, pero el último elemento apunta al primero en lugar de a NULL. – Útil en problemas (algoritmos) donde no hay un claro primer o último elemento. – Una ventaja: ¡la localidad que marca el “inicio” de la lista puede apuntar a cualquier elemento de esta! a1 a2 a3 a4