Professional Documents
Culture Documents
Tecnología Informática
Tecnicatura en Programación
de Computadoras
Estructura de
Datos: Lista
Autora:
Prof. Diana Cicinelli
Lunes a viernes de 9 a 21 h.
Torre Universitaria, Zabala 1837, primer nivel inferior.
C1426DQG - CABA
Teléfono: 4788-5400, internos 5002 y 2122.
Email: fasciculos@ub.edu.ar
www.ub.edu.ar
004300
Listas Prof. Diana Cicinelli
Introducción
Las estructuras de datos son necesarias para almacenar grandes cantidades de datos de
una forma organizada para que el procesamiento y recuperación de la información sea lo
más óptima posible.
Los lenguajes de alto nivel poseen estructuras de datos "primitivas" como los arreglos para
poder almacenar muchos datos simultáneamente. En un arreglo los datos se almacenan en
secuencia en el mismo bloque de memoria y se distinguen por la posición física que
ocupan, pero también, los lenguajes nos permiten "armar" estructuras de datos más
complejas donde cada dato se almacena individualmente y se enlaza con el resto de la
información mediante direcciones de memoria.
Las estructuras de datos complejas, para que sean fáciles de manipular se deben de
implementar formando lo que se denomina un Tipo Abstracto de Datos que encapsula la
representación en memoria del dato y el conjunto de funciones para manipular la
información de manera tal que con este conjunto de funciones se defina una biblioteca de
operaciones que se pueden aplicar a los datos como si fueran funciones pertenecientes al
lenguaje. Un Tipo Abstracto de Datos permite destacar la funcionalidad o características
de la estructura de datos y ocultar al usuario la forma en la que se representa en memoria.
Las estructuras de datos pueden ser de dos tipos según sea el tipo de almacenamiento que
1
Listas Prof. Diana Cicinelli
se use: estáticas, cuyo ejemplo básico es el arreglo y dinámicas cuyo ejemplo clásico es la
lista dinámica. En definitiva es esencial saber que tanto un arreglo como una lista
organizan la información de forma secuencial, esto quiere decir que cada elemento tiene
un antecesor y un predecesor a ecepción del primero que no tiene antecesor y el último
que no tiene sucesor.
Una lista almacenada en un arreglo estático tiene una desventaja muy importante que es
que la cantidad de datos máxima que podrá contener debe quedar fijada antes de su uso.
Cuando un programa usa arreglos debe estar sujeto a futuras modificaciones para
mofidicar el tamaño de los arreglos adecuándolos al incremento o decremento del
volumen de datos a procesar, pero también puede suceder que se reserve más memoria de
la que se necesita y por lo tanto no se use todo el espacio reservado con lo cual estamos
desperdiciando memoria que podría ser usada por otros procesos.
Listas
Una lista es una estructura secuencial <d1, d2, d3, ..., dn>, donde n indica la cantidad de
elementos de la lista, si n = 0 se dice que la lista está vacía y se denota por <>. El primer
elemento es d1 y el último elemento es dn. Cada elemento de la lista tiene un elemento
predecesor y un elemento sucesor con excepción del primero y último, d1 no tiene
elemento anterior a él y dn no tiene un elemento posterior a él. Dado di con 1 < i < n, tiene
como predecesor a di-1 y como sucesor a di+1.
Las listas se pueden almacenar en memoria de diferentes formas, las dos formas básicas
son la estática y la dinámica. Ya mencionamos la desventanja en tener un almacenamiento
estático, por lo tanto, en este apunte vamos a tratar el almacenamiento dinámico.
Vale la pena aclarar que en el comienzo de la computación, cuando los lenguajes de alto
nivel eran muy pocos y se desconocía el almacenamiento dinámico, la única forma de
representar una lista era a través de arreglos.
Listas Dinámicas
2
Listas Prof. Diana Cicinelli
significa que para acceder a un elemento determinado, para llegar a él hay que acceder a
todos los elementos anteriores a él, es decir que si queremos acceder a di debemos pasar
por d1, d2, d3, ..., di-1.
Una lista simplemente encadenada, enlaza cada uno de los elementos usando un puntero
mientras que una lista doblemente encadenada usa dos punteros, ambos casos se pueden
simular usando arreglos pero en este apunte vamos a usar punteros.
3
Listas Prof. Diana Cicinelli
En la figura anterior se puede apreciar que los enlaces son hacia adelante, hacia el último
elemento, este tipo de encadenamiento no permite retroceder.
TAD: Lista
Una lista como tipo abstracto de dato es una caja negra. Esto significa que tanto la forma
en la cual representemos los datos en memoria y las funciones que se definan sobre esa
representación quedan encapsuladas formando una unidad. Esta forma de trabajar con las
estructuras de datos permite escribir programas más óptimos permitiendo que el
mantenimiento del mismo sea mucho más fácil. Cuando debamos modificar la
representación de los datos para actualizarla a las necesidades del momento sabremos en
qué unidad está y lo mismo sucede con el conjunto de funciones definidas.
Las funciones hacen las operaciones definidas sobre la lista. Las operaciones que se
pueden realizar son:
• obtener el dato
• obtener el puntero al siguiente
• asignar un dato
• asignar un puntero
Para completar la abstracción hacen falta dos datos más que son la dirección del primer
elemento de la lista y el elemento que está siendo procesado en un determinado momento
al que se denomina elemento actual.
Todas las operaciones salvo algunas puntuales se hacen a través de el elemento actual,
entonces podemos tener que insertar o eliminar el elemento anterior al actual o el
elemento posterior al actual, obtener el dato del elemento actual, modificar el valor del
elemento actual.
4
Listas Prof. Diana Cicinelli
Implementación en Lenguaje C
Para llevar la abstracción a la implementación en lenguaje C debemos hacer uso del tipo
struct. Usaremos el struct para encapsular los datos del nodo y de la lista.
Vamos a definir el nodo sólo con dos variables miembro, el dato y el puntero al nodo
siguiente, mientras que la lista estará definida por la dirección del primer nodo, que es la
única dirección realmente necesaria para acceder a todos los elmentos de la lista y el
elemento actual, pero podemos agregar más información útil como por ejemplo la
longitud de la lista, mantener este dato hace que sea más fácil determinar si la lista está
vacía, longitud igual a 0, y además nos evita contar los elementos de la lista cada vez que
es necesario conocer su longitud.
Para llevar a cabo la implementación vamos a hacer uso de lo que se denomina Nodo
Cabecera, este nodo no llevará información útil en sí mismo sino que se lo utilizará de
comodín para que ciertas operaciones sean más fáciles de implementar. Por ejemplo para
poder insertar un elemento nuevo en una lista se deben tener en cuenta las siguientes
posibilidades:
Al tener una lista con un elemento cabecera nunca va a estar vacía físicamente, siempre
habrá un elemento que es el nodo cabecera por lo tanto nunca tendremos que insertar en
una lista vacía.
Otro elemento que vamos a incorporar es el Nodo Centinela para facilitar la operación de
eliminación cuando debemos eliminar el nodo último.
Todas las operaciones se realizarán sobre el elemento actual salvo algunas excepciones.
Vamos a tener en cuenta que los nodos centinela y cabecera permiten considerar que la
lista no está vacía desde el punto de vista físico, pero la lista está vacía desde el punto de
vista lógico porque aún no contiene información, la información por la cual estamos
construyendo la lista.
TDA Nodo
#ifndef _nodo
#define _nodo
typedef struct nodo {
tDato dato;
struct nodo * prox;
} Nodo;
#endif
5
Listas Prof. Diana Cicinelli
TDA Lista
#ifndef __ListaSimple
#define __ListaSimple
#include <stdio.h>
#include <stdlib.h>
#include "nodo.h"
typedef Nodo * Actual;
typedef struct {
Nodo * com;
Nodo * actual;
int longitud;
}Lista;
6
Listas Prof. Diana Cicinelli
7
Listas Prof. Diana Cicinelli
8
Listas Prof. Diana Cicinelli
//vacía la lista, eliminando cada nodo de ella sin eliminar los nodos cabecera y
centinela
void vaciarLista(Lista *l)
{
int i;
primero(l);
while (!esUltimo(l))
{
eliminarActual(l);
}
l->actual = l->com;
}
9
Listas Prof. Diana Cicinelli
}
#endif
10
Facultad Ingeniería y
Tecnología Informática
Tecnicatura en Programación
de Computadoras
Estructura de
Datos: Lista
Autora:
Prof. Diana Cicinelli
Lunes a viernes de 9 a 21 h.
Torre Universitaria, Zabala 1837, primer nivel inferior.
C1426DQG - CABA
Teléfono: 4788-5400, internos 5002 y 2122.
Email: fasciculos@ub.edu.ar
www.ub.edu.ar
004300