Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Listas
Listas
Listas (Lists)
Introducción a las listas
Implementación con arreglos
Implementación con listas enlazadas
Comparación de implementaciones
Objetivo
Aprender a utilizar la estructura de listas.
2
Estructuras de Datos
Listas (Lists)
Introducción a las listas
Implementación con arreglos
Implementación con listas enlazadas
Comparación de implementaciones
El TDA Lista (List)
• Una secuencia de elementos, no necesariamente distintos, que
tienen el mismo tipo de datos y son ordenados posicionalmente
• Ejemplos: una lista de estudiantes, una lista de eventos, una lista de
contactos, etc. Ampliamente usada en ciencias de la computación
void initialize(List *l)
void add(List *l, int idx, E item) List int contains(List *l, E item)
5
Operaciones de una lista
• initialize(List *l): inicializar una lista
• size(List *l): tamaño de la lista (número de elementos)
• append(List *l, E item): agregar ítem al final de la lista
• add (List *l, int idx, E item): agregar un ítem en el índice idx
• isEmpty(List *l): comprueba si la lista está vacía
• get(List *l, idx): obtener el elemento en el índice idx
• contains(List *l, E item): comprueba si ítem está en la lista
• remove(List *l, int idx): remueve el elemento en el índice idx
6
Estructuras de Datos
Listas (Lists)
Introducción a las listas
Implementación con arreglos
Implementación con listas enlazadas
Comparación de implementaciones
Uso de un array para implementar una lista
• Ventajas: implementación sencilla, recuperación rápida de
elementos (los índices del array representan posiciones de la lista)
count items[MAX_LIST]
k 12 3 19 75 .... 18 ? ? .... ?
0 1 2 3 k-1 MAX_LIST-1
8
Espacios utilizados Espacios libres
Especificación (archivo de cabecera)
9
Nota: para prevenir conflictos de nombres, se agregó el prefijo “list” a los nombres de las funciones.
Operaciones sencillas
count items[MAX_LIST] MAX_LIST
0 10
0 1 2 3 4 5 6 7 8 9
/* Inicializar la lista */
void listInitialize(List *l) {
l->count = 0;
}
10
Operaciones sencillas
count items[MAX_LIST] MAX_LIST
3 12 7 19 10
0 1 2 3 4 5 6 7 8 9
/* Tamano de la lista */
int listSize(List *l) {
return l->count;
}
3
4 12 7 19 30 10
0 1 2 3 4 5 6 7 8 9
4
5 12 7
41 19
7 30
19 30 10
0 1 2 3 4 5 6 7 8 9
5 12 41 7 19 30 10
0 1 2 3 4 5 6 7 8 9
return 0;
}
14
Remover un elemento con índice específico
count items[MAX_LIST] MAX_LIST
4
5 12 41 19
7 30
19 30 10
0 1 2 3 4 5 6 7 8 9
Listas (Lists)
Introducción a las listas
Implementación con arreglos
Implementación con listas enlazadas
Comparación de implementaciones
Lista enlazada
• Una cadena de nodos, conectados por punteros (enlaces)
• Requiere un puntero al primer nodo de la lista (head)
• Para acceder a otros nodos, se recorren los punteros next
• La lista crece dinámicamente, count es el número de elementos
item next item next item next item next item next
19 7 11 3 23
item next item next item next item next item next
19 7 11 3 23
5 El predecesor de 11 es 7 El sucesor de 11 es 3
El primer elemento es 19 El último elemento es 23
head count 18
Especificación (archivo de cabecera)
19
Nota: para prevenir conflictos de nombres, se agregó el prefijo “ list” a los nombres de las funciones.
Funciones auxiliares: crear un nuevo nodo
Se
: define una función que crea un nuevo nodo y devuelve un puntero a él:
3 19 7 23
return 0;
22
}
Inicializar lista, comprobar si está vacía
count head
/* Inicializar la lista */
void listInitialize(List *l) {
l->head = 0;
l->count = 0;
}
3 19 7 23
/* Tamaño de la lista */
int listSize(List *l) {
return l->count;
}
3
4 19 7 23
item next
31
newNode
if (idx == 0) {
newNode->next = l->head; /* El nodo head actual seguirá al nuevo */
l->head = newNode; /* Se actualiza head al nuevo nodo */
}
(l->count)++; /* Incrementa en 1 el número de nodos */ 26
}
Agregar un ítem en la k-ésima posición
count head item next item next item next
3
4 19 7 23
item next
31
prev newNode
29
Remover un nodo de la lista
Al remover un nodo de la lista, de forma análoga a la operación
agregar, los casos pueden resumirse en:
30
Caso 1: remover el primer nodo
count
E val;
head
Node *curr;
curr = l->head;
l->head = curr->next;
curr
val = curr->item;
free(curr);
count
(l->count)--; head
return val;
31
Caso 2: remover un nodo distinto al primero
E val; count
head
Node *prev, *curr;
prev = getNode(l, idx - 1);
curr = prev->next;
prev->next = curr->next; prev curr
free(curr); head
(l->count)--;
return val; 32
Remover un elemento: código completo
Clasificación de las listas enlazadas
(a) Listas simplemente enlazadas (b) Listas doblemente enlazadas
19 7 23 19 7 23
head head
(c) Listas circulares simplemente enlazadas (d) Listas circulares doblemente enlazadas
19 7 23 19 7 23
head head
34
Piense en cuál sería el código para implementar las operaciones de listas analizadas en clase para (b), (c) y (d)
Estructuras de Datos
Listas (Lists)
Introducción a las listas
Implementación con arreglos
Implementación con listas enlazadas
Comparación de implementaciones
Eficiencia de implementaciones: tiempo
Operación Arrays Listas enlazadas
Recuperar elementos Rápida: un solo acceso Mejor caso: recuperar el primer
elemento (un acceso)
Peor caso: recuperar el último
elemento (recorre toda la lista)
Agregar elementos Mejor caso: agregar al final (no hay Mejor caso: agregar al principio (un
desplazamiento de elementos) solo acceso)
Peor caso: agregar al principio Peor caso: agregar al final (recorre toda
(desplaza todos los elementos) la lista)
Remover elementos Mejor caso: remover el último Mejor caso: remover el primer
elemento (no hay desplazamiento de elemento (un solo acceso)
elementos) Peor caso: remover el último elemento
Peor caso: remover el primer (recorre toda la lista)
36
elemento (desplaza toda la lista)
Eficiencia de implementaciones: tiempo
37
Eficiencia en el uso de espacio
• Al usar arrays, el tamaño de la lista está restringido a MAX_LIST,
el problema es que el tamaño máximo no se conoce por
anticipado:
MAX_LIST muy grande == espacio desperdiciado
MAX_LIST muy pequeño == espacio se agota fácilmente
38
Las listas enlazadas no tienen esta restricción, pero cada
nodo usa más espacio en memoria para mantener punteros a
los nodos siguientes y son más complejas de implementar
39