Documente Academic
Documente Profesional
Documente Cultură
NUCLEO DE ANZOATEGUI
POSTGRADO EN INFORMATICA GERENCIAL
ESTRUCTURAS DE DATOS
Ing. Jose Manuel Diaz M.Sc.
En programacin, una estructura de datos es una forma de organizar un
conjunto de datos elementales con el objetivo de facilitar su manipulacin y
aumentar el rendimiento de un sistema. Un dato elemental es la mnima
informacin que se tiene en un sistema. Las Estructuras de Datos se pueden
clasificar de la siguiente manera:
1.- Internas
1.1- Estticas
1.1.1- Arreglos
1.1.2- Matrices
1.2- Dinmicas1.2.1- Lineales
1.2.1.1- Listas
1.2.1.2- Pilas
1.2.1.3- Colas
1.2.2- No Lineales
1.2.2.1- rboles
1.2.2.2- Grafos
2.- Externas
2.1- Bases de Datos
2.2- Archivos
Definiciones
En un lenguaje de programacin, un tipo de dato est definido por el conjunto de valores que
representa y por el conjunto de operaciones que se pueden realizar con dicho tipo de dato. Por
ejemplo, el tipo de dato entero en Java puede representar nmeros en el rango de -2^31 a 2^31-1 y
cuenta con operaciones como suma, resta, multiplicacin, divisin, etc.
Por otro lado, podemos decir que en la solucin de un problema a ser procesado por un computador
encontrar dos grandes tipos de datos: datos simples y datos estructurados. Los datos simples son
aquellos que, al ser representados por el computador, ocupan solo una casilla de memoria. Debido a
esto, una variable de un tipo de dato simple hace referencia a un nico valor a la vez. Ejemplo de
estos tipos de datos son los enteros, reales, caracteres y booleanos.
As mismo, los datos estructurados se caracterizan porque su definicin est compuesta de otros
tipos de datos simples, as como de otros datos estructurados. En este caso, un nombre (identificador
de la variable estructurada) hace referencia no solo a una casilla de memoria, sino a un grupo de
casillas.
En programacin, el trmino estructura de datos se utiliza para referirse a una forma de organizar
un conjunto de datos que se relacionan entre si, sean estos simples o estructurados, con el objetivo
de facilitar su manipulacin y de operarlo como un todo.
Por otro lado, tenemos el trmino Tipo de Dato Abstracto, o TDA, que es muy comnmente utilizado
como equivalente al trmino estructura de datos para referirse justamente a un tipo de dato
estructurado que representa un concepto a travs de la definicin de sus caractersticas (datos que lo
conforman) y de sus operaciones(algoritmos que manipulan los datos que lo conforman).
Operaciones
Sobre una estructura de datos se puede efectuar diferentes tipos de operaciones, entre las ms
importantes estn:
Insercin. Es aquella mediante la cual se incluye un nuevo elemento en la estructura.
Modificacin. Permite variar parcial o totalmente el contenido de la informacin de los elementos de
la estructura.
Eliminacin. Como su nombre lo indica, es la que permite suprimir elementos de la estructura.
Navegar por la estructura: Esta es una operacin bsica que garantiza que se puede recuperar
informacin almacenada.
Bsqueda. Permite determinar si un elemento se encuentra o no en la estructura.
Consulta de la informacin. Permite obtener informacin de uno o ms elementos de la estructura.
Copia parcial o total: Mediante esta operacin se puede obtener total o parcialmente una estructura
con caractersticas similares a la original.
Prueba. Permite determinar si uno o varios elementos cumplen determinadas condiciones.
Verificar si es vaca. Permite determinar si existen o no elementos sobre la estructura.
Clasificacin
Una clasificacin de estructuras de datos es, segn dnde residan: Internas y externas. Si una
estructura de datos reside en la memoria principal del computador se denomina estructura de datos
interna. Recprocamente, si reside en un soporte externo, se denomina estructura de datos externa.
Las estructuras de datos internas pueden ser de dos tipos:
1. La reorganizacin de sus elementos, si sta implica mucho movimiento puede ser muy
costosa. Ejemplo: insertar un dato en un arreglo ordenado.
2. Son estructuras de datos estticas, es decir, el tamao ocupado en memoria es fijo, el
arreglo podra llenarse y si se crea un arreglo de tamao grande se estara desperdiciando
memoria.
Lineales
No lineales
Colas: tienen dos puntos de acceso, uno para aadir y el otro para consultar o eliminar
elementos.
Algoritmo es toda receta, proceso, rutina, mtodo, etc. que adems de ser un conjunto de
instrucciones que resuelven un determinado problema, cumple las siguientes condiciones:
Ser finito. La ejecucin de un algoritmo acaba en un tiempo finito; un procedimiento que falle
en la propiedad de la finitud es simplemente un procedimiento de clculo.
Ser preciso. Cada instruccin de un algoritmo debe ser precisa; deber tenerse en cuenta un
rigor y no la ambigedad, esta condicin es la definicin: cada frase tiene un significado
concreto.
Posee entradas. Las entradas se toman como un conjunto especfico de valores que
inicializan el algoritmo.
Aqu se pretende cubrir estas dos grandes reas: la relevancia de los datos y sus tipos en la solucin
de un problema, y el anlisis de eficiencia de las instrucciones que se eligen para resolver un
problema.
Cadenas
Las cadenas de caracteres como se les conoce se definen como secuencia de caracteres en un
alfabeto:
hola, casa, perro, y 67Frabe \#
Una cadena de caracteres (string) es un conjunto de caracteres (incluido el blanco) que se
almacenan en localidades contiguas de memoria. Se representa como un vector de caracteres donde
cada elemento del vector representa un caracter de la cadena.
Estructura de almacenamiento
Un byte (8 bits) por cada caracter de la cadena almacenada en bytes contiguos en memoria.
Operaciones
Longitud(cadena): Entero, regresa la longitud actual de la cadena
Lon(casa) regresa 4
Concatenar(cadena1, cadena2): Cadena, concatena dos cadenas.
Concatenar(casa, blanca) regresa casablanca
subcadena(cadena, inicio, longitud): cadena, regresa la subcadena de cadena que comienza en
inicio y que tiene la longitud especificada.
subcadena(casablanca, 3, 2) regresa sa
indice(cadena1, cadena2): Entero, regresa la posicin de inicio de la primera ocurrencia de
cadena2 en cadena1.
indice(casablanca, a) regresa 2
Las comparaciones (<, >, =, , , ) se efectan segn el orden lexicogrfico dado por el cdigo
ASCII.
A continuacin se presentan tres algoritmos en pseudocdigo
operaciones comunes con este tipo de datos:
Bsqueda
Listas
Las Listas son tipos de datos abstractos lineales que representan secuencias de elementos y que
presentan una particular flexibilidad en su manejo: pueden crecer y acortarse segn se necesite,
todos los elementos del conjunto se pueden acceder, se puede aadir nuevos elementos en cualquier
lugar de la secuencia donde se especifique, as como se puede eliminar cualquier elemento del
conjunto.
Una lista es equivalente a un contenedor de elementos, donde los valores pueden repetirse. Los
valores almacenados en ella se conocen como tem o elementos de la lista. Con frecuencia se
representan las listas como una sucesin de elementos separados por comas:
a1, a2, ...., an
Donde n representa la longitud de la lista y es mayor a cero y ai representa a cada elemento. Si n = 0
tendremos una lista vaca.
Las listas difieren de los arreglos porque sus elementos no se encuentran indexados, es decir, el
acceso a cada elemento debe ser hecho de forma secuencial, mientras que en los arreglos se hace
de forma aleatoria.
El TDA Lista puede ser implementado utilizando diferentes estructuras de datos: la implementacin
esttica de las Listas implica la utilizacin de un arreglo para representar al conjunto de datos,
mientras que la implementacin dinmica se basa en el uso de referencias a objetos o punteros.
Muchos lenguajes de programacin proveen una implementacin del tipo de dato Lista.
En este captulo se ofrecern defunciones informales y formales del TDA (sus caractersticas y
operaciones), se discutirn sus posibles implementaciones, se pondr a disposicin cdigo fuente de
algunas implementaciones en varios lenguajes y se propondrn problemas de aplicacin de las
Listas.
Pilas
Una pila (stack en ingls) es una lista ordinal o estructura de datos en la que el modo de acceso a
sus elementos es de tipo LIFO (del ingls Last In First Out, ltimo en entrar, primero en salir) que
permite almacenar y recuperar datos. Se aplica en multitud de ocasiones en informtica debido a su
simplicidad y ordenacin implcita en la propia estructura.
Las pilas son muy utilizadas en programacin, para evaluar expresiones, reconocer lenguajes,
recorrer rboles y simular procesos recursivos. En todo momento, el nico elemento visible de la
estructura es el ltimo que se coloc. Se define el tope de la pila como el punto donde se encuentra
dicho elemento, y el fondo, como el punto donde se encuentra el primer elemento incluido en la
estructura.
Colas.
La Cola o Queue es otra de las estructuras de datos que estudiaremos. Como las pilas, las colas son
muy simples de entender e implementar. La idea de la cola es simular el funcionamiento de una cola
de la vida real, por ejemplo, la cola de un banco. Imaginemos que tienes una pistola de juguete
parecida a la del ejemplo de pila, pero ahora, para cargarla, debes introducir las pelotas por la parte
trasera del can. Eso es una Cola. La cola es una estructura que se basa en el concepto FIFO:
First In First Out, es decir, el primer elemento que entra es el primero que sale. Tal como las pilas, la
implementacin de la pila es muy parecida a la de lista enlazada, y slo difiere en la forma que
gestionamos los elementos almacenados. En una cola, crearemos mtodos que cumplan las
funciones expuestas anteriormente y aclaradas con la Fig. 4.1.1, es decir, un mtodo que agregue un
nodo al principio de la cola y otro que elimine el ltimo nodo de sta. Para esta implementacin, los
nodos sern instancias de la clase Nodo, definida anteriormente en el archivo Nodo.java. Para poder
continuar, es necesario que revises detalladamente la definicin de esta clase. La explicacin de su
funcionamiento fue agregada en el mismo cdigo en forma de comentario.
Tipos
De acuerdo a su comportamiento, los conjuntos lineales se clasifican en:
Simples
Doblemente Enlazadas
Circulares
Listas Simples
Estado:
Usando notacin BNF (Backus-Naur-Form)
<listaSimple> ::=<comienzo>+{<ref nodo>}+<final>
<comienzo> ::=<enlace>
<final>
::=<enlace>
Una lista esta compuesta de nodos, y por eso es importante definir el TDA Nodo.
Comportamiento
Crear y Eliminar
Consultar y modificar la informacin que almacena
Implementacin en C
Implementacin Contigua
Se utilizan arreglos, por lo tanto
El enlace con el siguiente nodo sera el ndice del siguiente elemento del arreglo.
Operaciones
Creacin y Eliminacin
LSCont *LSCont_Crear(int n);
void LSCont_Vaciar(LSCont *L);
Bsqueda y recorrido.
intLSCont_BuscarNodo(LSCont L, Generico G, Generico_ComoCompararfn);
Declaracin
La lista contigua es un arreglo de elementos de cualquier tipo ,realmente es un ARRAYU.FIg
Para lograr mantener control sobre la cantidad de elementos en la lista debe existir una
referencia que controle el ltimo elemento.
La referencia al ltimo se mover de acuerdo a las inserciones y eliminaciones.
Funciones Bsicas
voidLSCont_VaciarLista(LSCont *L){L->ultimo = -1; }
LSCont *LSCont_CrearLista(intmax){
LSCont *nuevalista;
nuevalista->Elementos =
ArrayU_Crear(max, 0);
nuevalista->ultimo = -1;
returnnuevalista;
}
voidLSCont_EliminarLista(LSCont *L){
ArrayU_Eliminar(&(L->Elementos));
LSCont_VaciarLista(L);
}
boolLSCont_EstaVacia(LSCont L){
return(L.ultimo<0);
}
boolLSCont_EstaLlena(LSCont L){
return (L.ultimo == ArrayU_Tamanio(L.Elementol)-1);
}
//Bsqueda
int LSCont_BuscarNodo(LSCont L, Generico G, Generico_Comparacionfn){
int i;
Generico elemento;
for(i = 0; i <=L.ultimo;i++){
elemento = ArrayU_ElemC(L.Elementos, i);
if(f(elemento, G) == 0) return (i)
}
return(-1);
}
//Insertar
bool LSCont_InsertarInicio(LSCont *L, Generico G){
int i;
Generico ele1, ele2;
//No insertar si ya esta llena
if(LSCont_EstaLlena(L)) return FALSE;
//Mover todo hacia delante
for(i = L->ultimo; i >=0 ;i--){
ele1 = ArrayU_ElemC(L->Elementos,i);
ArrayU_ElemM(L->Elementos,i+1, ele1);
}
ArrayU_ElemM(L->Elementos, 0, G);
L->ultimo++;
return(TRUE);
}
bool LSCont_Insertar(LSCont *L, int P, Generico G){
int i,
Generico ele1;
Otra forma es llevar el control del primero y el ltimo elemento, por ejemplo:
typedefstruct{
LSE_Nodo*header; //header y last son punteros a nodo en una lista enlazada
LSE_Nodo*last;
}LSE;
//Funcin de Bsqueda
Hay que ubicarse en el inicio: header e ir avanzando hasta encontrar el nodo con la
informacin buscada o que ya no haya mas nodos.Como no se usan ndices, se usan punteros:
LSE_nodo *LSE_BuscarNodo(LSE L,
Generico G,
Generico_fnComparar f){
LSE_nodo *p;
for(p = L.header; p!= NULL; p = LSE_Nodo_Siguiente(p)){
if(f(LSE_Nodo_Contenido(p),G) ==0) return(p);
}
return(NULL);
}
En el ejemplo se busca el nmero 25, un puntero se ubicar en el header y luego ir avanzando al siguiente, y al
siguiente y al siguiente.
Si el nmero que se busca se encuentra en la lista, se retorna la direccin de se nodo.
// Funcin Insertar
La operacin de insertar recibir el nodo que se va a insertar, para lo cual este nodo ya debi
haber sido creado antes de insertarlo. Hay varios tipos de insercin: insertar al inicio o al final
,insertar en medio de la lista.
nuevo->sig = header;
header = nuevo;
nuevo, L->header);
L->header = nuevo;
}
return(TRUE);
}
En el ejemplo se desea insertar un nuevo nodo al inicio de la lista.Si la lista esta vaca, tanto header como last
apuntan al nuevo nodo.
boolLSE_Insertar(LSE *L,
LSE_nodo *p,
LSE_nodo *nuevo){
if(L->last==p){//Insertar al final
return(LSE_InsertarNodoFin(L, nuevo));
}else{
if(!p || ! LSE_ExisteNodo(*L,p))
return FALSE;
if(LSE_EstaVacia(*L))
L->header = L->last = nuevo;
else{
LSE_Nodo_ModificarEnlace(
nuevo, LSE_Nodo_Siguiente(p));
LSE_Nodo_ModificarEnlace(p, nuevo);
}
}
return(TRUE);
header=header->siguiente;
fre(tmp);
L->last->sig = NULL;
}
return(tmp);
Listas Especiales
TDA: LISTAS DOBLEMENTE ENLAZADAS
En las listas enlazadas solo se avanza en un sentido, en las listas doblemente enlazadas, se puede
avanzar hacia la derecha o hacia la izquierda.
En estas listas cada nodo tiene un predecesor, excepto el primero, un sucesor, excepto el ltimo.
Cada nodo ya no tiene un solo enlace, tiene dos, hacia el siguiente y hacia el anterior.
Implementacin
typedefstructLDE_Nodo {
Generico G;
structLDE_nodo *sig;
structLDE_nodo *ant;
} LDE_nodo ;
typedefstruct {
LDE_Nodo *header;
LDE_Nodo *last;
}LDE;
Insertar Nodos
LDE_nodo *nuevo){
if(LDE_EstaVacia(&L))
else{
nuevo->ant = L->last;
L->last->sig = nuevo;
L->last = Nuevo;
return FALSE;
Listas Circulares
El avance en las listas enlazadas es solo a la derecha(siguiente) y limitado hasta el ltimo nodo.Hay
ocasiones en las que se deseara, poder avanzar ilimitadamente ,es decir, del ltimo nodo, pasar al
primero.
last->siguiente = header
typedefLCE_nodo *LCE;
typedefstructLCE_nodo{
Generico G;
structLCE_nodo *sig;
}LCE_nodo;
//Nodo anterior
Se busca el anterior a un nodo dado.
//Insertar en medio
boolLCE_Insertar(LCE *L, LCE_Nodo *P, LCE_Nodo *nuevo){
if(P == NULL || !LCE_Existe(*L,P)) return FALSE;
if(LCE_EstaVacia(*L) || p==L) LCE_InsertarNodoFin(L,nuevo);
else {
nuevo->sig = P->sig;
P->sig = Nuevo;
}
return TRUE;
}
Es una implementacin de listas circulares con nodos que tienen dos punteros, as se recorre
la lista en el sentido del avance del reloj y en sentido contrario
Y tambin se contina llevando control solo el ltimo nodo de la lista.
//Recorrer lista
Con esta funcin se puede recorrer un lista circular hacia atrs.
voidLCDE_Recorre_R(LCDE L, Generico_Imprimirfn){
LCDE_nodo *pos;
if(!LCDE_EstaVacia(L)) return;
pos = L;
while(TRUE){
pos = pos->ant;
if(pos == L) break;
fn(pos->G);
}
}
Ejercicios para la Evaluacin del curso: