Upload
brayan-milton-ormeno-lee
View
216
Download
0
Tags:
Embed Size (px)
Citation preview
*
Estructuras de Datos Elementales:stacks (pilas), queues (colas), linked lists (listas enlazadas), y rooted trees (rboles con raz)
Agustn J. Gonzlez
ELO320: Estructura de Datos y Algoritmos
1 Sem. 2004
*
Introduccin
Los conjuntos son tan fundamentales en los computacin como lo son en matemticas.En nuestro campo, los conjuntos cambian (crecen, se reducen, etc.). A stos se les llama conjuntos dinmicos.Dependiendo de las operaciones que el algoritmo requiere sobre el conjunto, stos son conocidos con diferentes nombres.Por ejemplo, el conjunto que permite insertar, eliminar, y consultar por pertenencia, es llamado diccionario.*
Operaciones sobre conjuntos dinmicos:Search(S,k) retorna Insert(S,x) Modifica S incorporando el elemento apuntado o denotado por x.Delete(S,x) Modifica S removiendo el elemento apuntado o denotado por x.Minimum(S) Retorna el elemento de S con la menor clave.Maximum(S) Retorna el elemento de S con la mayor clave.Successor(S,x) Retorna el elemento de S cuya clave es la menor no inferior a la clave de x. Si x es el elemento mximo, retorna NIL. La clave es un atributo ordenable de los elementos.Predecessor(S,x) Retorna el elemento de S cuya clave es la mayor no superior a la clave de x. Si x es el elemento menor, retorna NIL.Introduccin (cont)
*
Stacks y Queues como conjuntos dinmicos
Los stacks y las queues son conjuntos dinmicos en los que el elemento removido por Delete est predefinido. En stacks slo se puede remover el elemento ms recientemente insertado. Implementa as una poltica last-in, first-out o LIFO.Las queues slo pueden remover el elemento ms antiguo del conjunto. Implementa una poltica first-in, first-out o FIFO.*
Stacks
La operacin Insert es llamada aqu PUSH.La operacin Delete es llamada POP. Si se hace un POP de un stack vaco, decimos que hay un underflow, lo cual es un error de programa.Si la implementacin del stack posee un lmite para el nmero de elementos y ste se excede, decimos que hay un overflow. Tambin es un error. Se incorpora la funcin TOP que retorna el valor ms reciente sin modificar el stack.Ejemplos de uso: Cuando hacemos undo en editores.Cuando hacemos back en un navegador.*
Implementacin de stack con arreglo
#include /* para eliminar validaciones, agregar #define NDEBUG*/Const int MAX_ELEMENTS = 100;typedef struct stack {*
Queues
La operacin Insert es llamada Enqueue. La operacin Delete es llamada Dequeue.Cada queue tiene una head (cabeza) y un tail (cola).Tambin se pueden producir las condiciones de overflow y underflow cuando la implementacin tiene capacidad limitada.Se incorpora la funcin Head que retorna el valor ms antiguo de la cola.*
Implementacin de queue con arreglo circular
Const int MAX_ELEMENTS = 100;typedef struct stack {*
Const int MAX_ELEMENTS = 100;typedef struct stack {Ejercicio:
Otra forma de distinguir entre cola llena o vaca es dejar libre una casilla al final de la cola. Implemente esta estrategia (elimina la variable count.)
Implementacin de queue con arreglo circular (cont)
*
Listas Enlazadas
Una lista enlazada es una estructura de datos en la que los objetos estn ubicados linealmente. En lugar de ndices de arreglo aqu se emplean punteros para agrupar linealmente los elementos.La lista enlazada permite implementar todas las operaciones de un conjunto dinmico.En una lista doblemente enlazada cada elemento contiene dos punteros (next, prev). Next apunta al elemento sucesor y prev apunta la predecesor.*
Listas Enlazadas (cont.)
Si el predecesor de un elemento es nil, se trata de la cabeza de la lista.Si el sucesor de un elemento es nil, se trata de la cola de la lista.Cuando la cabeza es nil, la lista est vaca.Una lista puede ser simplemente enlazada. En este caso se suprime el campo prev.Si la lista est ordenada, el orden lineal de la lista corresponde al orden lineal de las claves.En una lista circular, el prev de la cabeza apunta a la cola y el next de la cola apunta a la cabeza.*
Vistazo a punteros en C
Implementacin de Listas doblemente Enlazadas (Sin Centinela)
typedef struct nodo_lista {*
Obs: el detalle de los argumentos formales son parte del protocolo para usar la estructura de datos.
Lo mostrado aqu no es la nica opcin vlida. Los argumentos para List_Insert pudieron ser, por ejemplo,
List_Insert(P_NodoLista *posicion, int elemento)
Cul es el tiempo de ejecucin de List_Search?
Cul es el tiempo de ejecucin de List_Insert?
Implementacin de Listas doblemente Enlazadas (Sin centinela) (cont)
typedef struct nodo_lista {*
1.- Cul es el tiempo de ejecucin de List_Delete?
2.- Ejercicios: Implementar las operaciones antes descritas para una lista simplemente enlazada.
3.- Otra opcin para implementar listas doblemente enlazadas es hacer uso de un Centinela. En este caso la lista es circular y se inicia con un elemento auxiliar o mudo, apuntando a s mismo. As el cdigo no requiere tratar en forma especial las condiciones de borde (eliminacin del ltimo elemento y eliminacin del primero). Hacer cdigo como ejercicio.
Implementacin de Listas doblemente Enlazadas sin Centinela (Continuacin)
typedef struct nodo_lista {*
Implementacin de Listas doblemente Enlazadas Con Centinela
Void List_Delete( P_NodoLista x) {head
Mudo
Centinela
*
Ejercicio 1
Dada una lista circular L doblemente enlazada. Desarrolle una funcin que dado dos punteros x, y a nodos de la lista L, permita intercambiarlos.typedef struct _nodo {struct _nodo * next, * prev;Elemento elemento;} NODO;Solucin:
void swap (NODO *x; NODO*y) {
NODO * tmp;
tmp =x->prev;
x->prev = y->prev;
y->prev = tmp;
tmp = x->next;
x->next=y->next;
y->next = tmp;
}
*
Pero qu tal si uno de los nodos es el primero o ltimo?
void swap_nodos( NODO * * pl, NODO * x, NODO * y) {
NODO * aux = x;
if (x==y) return;
if (*pl==x) *pl = y;
if (*pl==y) *pl = x;
if (x->next !=y && x->prev != y) {
x->prev->next = y;
x->next->prev=y;
y->prev->next = x;
y->next->prev=x;
swap (x,y);
} else if (x->next == y && x->prev == y)
return;
else if (x->next == y) {
y->next->prev = x;
x->prev->next = y;
swap(x,y);
}else {
x->next ->prev =y;
y->prev->next =x;
}
}
*
Ejercicio 2:
Codifique en C las operaciones Enqueue y Dequeue de una cola (queue) implementada con la estructura de datos lista doblemente enlazada con centinela. Considere la siguiente estructura para cada nodo:typedef struct nodo_lista {*
Ejercicio 2: Solucin: Enqueue
void Enqueue(NODO_LISTA * head, NODO_LISTA * x)
{
/* head apunta al centinela y x apunta al nodo que se desea incorporar en la cola*/
x->next = head->next;
head->next->prev = x;
x->prev = head;
head->next=x;
}
*
Ejercicio 2: Solucin :Dequeue
NODO_LISTA * Dequeue(NODO_LISTA * head)
{
/* head apunta al centinela, Dequeue retorna el ms antiguo de la cola*/
NODE_LISTA * x; /* nodo a eliminar y retornar */
x = head->prev;
head->prev = x->prev;
x->prev->next=head;
return x;
}
Y qu tal si la cola estaba vaca?
*
rboles con Raz
La idea de usar estructuras de datos enlazados se puede usar tambin para representar rboles.Como en las listas enlazadas, supondremos que cada nodo del rbol contiene un campo clave, los restantes campos contienen punteros a otros nodos del rbol.rboles BinariosEn este caso usamos los campos p, left, y right para almacenar punteros al padre, hijo izquierdo, e hijo derecho de cada nodo del rbol binario.Si x.p == NULL, entonces x es la raz.Posible estructura a usar:*
rboles con Raz (cont)
En este caso una posible estructura es:NULL
NULL
NULL
NULL
NULL
NULL
NULL
T
*
Vistazo a Punteros en C
En C se emplea un * para declarar un puntero. Si p apunta a un carcter, se declara: char *p;*
Vistazo a Punteros en C (cont)
Para dar claridad a las estructuras de un programa es comn que se defina un nuevo tipo y as se le pueda asignar un nombre que represente de mejor forma el tipo de dato. Por ejemplo:*
Vistazo a Punteros en C (cont)
Cuando un puntero no tiene definido su valor, sus campos no deben ser accedidos para no incurrir en errores de acceso fuera del espacio de memoria del usuario (segmentation fault).*
Volver
Vistazo a Punteros en C (cont)
sizeof(Node_Type) es un operador interpretado por el compilador y retorna el tamao en byte requerido por cada variable del tipo indicado.*
Divertimento
Una fbrica de aspirinas tiene 7 depsitos con aspirinas de 100 mg correspondientes a la produccin de cada da de una semana.El generente de produccin fue notificado que durante un da de la semana las aspirinas resultaron de 110 mg.Usando una pesa slo una vez, Cmo puede determinar el depsito con las aspirinas defectuosas?Lu
Ma
Mi
Ju
Vi
Sa
Do
k
clave
con
elementos
hay
no
Si
nil
k
es
clave
su
que
tal
S
en
elemento
un
a
puntero