Listas

Anuncio
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
Descargar