Capítulo 2 - Estructuras Dinámicas 2.1 – Introducción Capítulo 2

Anuncio
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Capítulo 2 - Estructuras Dinámicas
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
2.1 – Introducción
2.2 – Listas
Una estructura de datos dinámica es aquella en la que el tamaño ocupado en
memoria puede modificarse durante la ejecución del programa.
Una lista es una colección de elementos organizados en secuencia que puede
crecer y decrecer libremente y a cuyos elementos individuales se puede acceder,
insertar y eliminar en cualquier posición.
De esta manera se pueden adquirir posiciones adicionales de memoria a medida
que se necesiten durante la ejecución del programa y liberarlas cuando no se
necesiten.
Las variables que se crean y están disponibles durante la ejecución del programa
se llaman variables continuas.
Las listas se clasifican en contiguas, enlazadas, circulares y doblemente
enlazadas.
2.2.1 – Listas Contiguas
Estas variables se representan con
un tipo de dato llamado puntero
Los elementos de la lista se almacenan normalmente en posiciones consecutivas
de memoria, es decir, almacenamiento secuencial, donde se define la constante
longitud máxima, que determina el tamaño de la mayor lista que se puede tener
Las estructuras de datos dinámicas se clasifican en lineales (listas, pilas y colas) y
no lineales (árboles y grafos)
Se implementan a través de arreglos, donde la inserción o eliminación de un
elemento excepto en la cabecera o al final de la lista necesitará una traslación de
los elementos de la lista.
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Capítulo 2 - Estructuras Dinámicas
ICI 241 – Estructura de Datos
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
2.2.1 – Listas Contiguas
2.2.1 – Listas Contiguas
Creación de lista contigua:
0
1
2
……..
último
elemento
struct lista* Crear(){
struct lista* L = (struct lista*) malloc(sizeof(struct
Lista
Límite superior
lista));
L-> ultimo=0;
Espacio Libre
return L;
}
La declaración en C de una lista implementada por arreglos es la siguiente:
struct lista{
int elem[long_max];
int ultimo;
}
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
ICI 241 – Estructura de Datos
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
ICI 241 – Estructura de Datos
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
2.2.1 – Listas Contiguas
2.2.1 – Listas Contiguas
Inserción en una lista contigua:
Eliminación en una lista contigua:
struct lista* Insertar(int x, int pos, struct lista* L){
struct lista* Eliminar(int p, struct lista* L){
int q;
if((p<1)||(p>L->ultimo))
if(L->ultimo>=long_max)
printf(“posicion no existe”);
printf(“lista llena”);
else{
else if((p<1)||(p>L->ultimo))
L->ultimo=L->ultimo-1;
printf(“posicion no existe”);
for (q=p;q<L->ultimo;q++)
for (q=L->ultimo;q>=p;q--)
}
else{
L->elem[q-1] = L->elem[q];
L->elem[q] = L->elem[q-1];
return L;
L->ultimo=L->ultimo+1;
}
L->elem[q]=x;
}
return L;
}
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
1
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
2.2.1 – Listas Contiguas
2.2.2 – Listas Enlazadas
Localización de un elemento en una lista contigua:
Son mucho más flexibles que las listas contiguas, la inserción o borrado del
elemento enésimo no requiere el desplazamiento de los otros elementos de la
lista.
int Localizar(int x, struct lista* L){
int q;
for (q=1;q<=L->ultimo;q++){
Los elementos se almacenan en posiciones de memoria que no son continuas o
adyacentes, por lo que cada elemento necesita almacenar la posición o dirección
del siguiente elemento de la lista.
if(L->elem[q-1]==x)
return q;
else{
/*elemento no encontrado*/
Head
q=L->ultimo+1;
return q;
}
}
NULL
}
1er nodo
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
Desarrollado por
Ricardo Soto De Giorgis
Lista
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
2.2.2 – Listas Enlazadas
2.2.2 – Listas Enlazadas
Creación de una lista enlazada con 10 nodos (con valores de 0 a 9):
La notación algorítmica que utilizaremos es la siguiente:
#include <stdio.h>
puntero_a <tipo de dato>:punt
puntero_a nodo:punt
struct nodo{
registro: nodo
int elem;
entero:elem
punt:sgte
struct nodo *sgte;
}
fin_registro
Creación de lista enlazada:
struct nodo* Crear(){
struct nodo* L = (struct nodo*)malloc(sizeof(struct
nodo));
L-> sgte=NULL;
return L;
struct nodo{
int elem;
struct nodo *sgte;
};
#define LISTA struct nodo
int i;
LISTA *p,*head,*temp;
main(){
p=(struct nodo*)malloc(sizeof(struct nodo));
p->elem=0;
head=p;
for(i=1;i<10;i++){
temp=p;
p=(struct nodo*)malloc(sizeof(struct nodo));
p->elem=i;
temp->sgte=p;
}
}
}
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
ICI 241 – Estructura de Datos
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
#include <stdio.h>
struct nodo{
int elem;
struct nodo *sgte;
};
#define LISTA struct nodo
int i;
LISTA *p,*head,*temp;
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
2.2.2 – Listas Enlazadas
p=head;
for(i=1;i<3;i++){
p=p->sgte;
}
aux=p->sgte;
p->sgte=aux->sgte;
free(aux);
main(){
p=(struct nodo*)malloc(sizeof(struct nodo));
p->elem=0;
head=p;
for(i=1;i<10;i++){
temp=p;
p=(struct nodo*)malloc(sizeof(struct nodo));
p->elem=i;
temp->sgte=p;
}
}
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
Capítulo 2 - Estructuras Dinámicas
2.2.2 – Listas Enlazadas
Eliminación del nodo con valor 3:
Desarrollado por
Ricardo Soto De Giorgis
Inserción del nodo con valor 3:
#include <stdio.h>
struct nodo{
int elem;
struct nodo *sgte;
};
#define LISTA struct nodo
int i;
LISTA *p,*head,*temp;
aux=(struct nodo*)malloc(sizeof(struct nodo));
aux->elem=3;
p=head;
for(i=1;i<3;i++){
p=p->sgte;
}
aux->sgte=p->sgte;
p->sgte=aux;
main(){
p=(struct nodo*)malloc(sizeof(struct nodo));
p->elem=0;
head=p;
for(i=1;i<10;i++){
temp=p;
p=(struct nodo*)malloc(sizeof(struct nodo));
p->elem=i;
temp->sgte=p;
}
}
ICI 241 – Estructura de Datos
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
2
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
2.2.3 – Listas Circulares
2.2.3 – Listas Doblemente Enlazadas
Las listas circulares corresponden al tipo de listas que poseen el campo sgte del
ultimo elemento de la lista apuntando al primero.
Las listas doblemente enlazadas corresponden al tipo de listas en las cuales el
recorrido puede hacerse en ambos direcciones.
De esta manera es posible acceder desde un elemento a cualquiera de los
elementos que le preceden.
En este tipo de listas además de utilizarse el puntero SGTE se utiliza un puntero
llamado ANT.
Head
Fin
Head
1er nodo
SGTE
Hay que tener en cuenta que se pueden producir lazos o bucles infinitos, para
evitar esto siempre hay que contar con un nodo que identifique el principio o el
final de la lista.
Contar con un nodo cabecera con un tipo de dato que permita identificar su
condición (tipo de dato no válido como datos de otros elementos).
INFO
Es necesario indicar una propiedad fundamental de las listas doblemente
enlazadas:
p->sgte->ant=p
p->ant->sgte=p
Ubicar un indicador o puntero en el nodo cabecera.
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
ANT
Cada elemento tiene dos punteros y por consiguiente una lista enlazada ocupa
más memoria que una lista simplemente enlazada
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
2.3 – Pilas
2.3 – Pilas
Una Pila (stack) es un tipo especial de lista lineal en la que la inserción y
borrado de nuevos elementos se realiza sólo por un extremo, el cual es
denominado cima o tope.
Las pilas se pueden implementar con arreglos o punteros.
....
1
2
3
cima-1
cima
Espacio de la pila no utilizado
En principio la pila está vacía y el puntero de la pila o CIMA está en cero
Al meter un elemento en la pila, se incrementa el puntero en una unidad
Al sacar un elemento de la pila, se decrementa el puntero en una unidad
Dado que las operaciones de insertar y eliminar se realizan por un solo
extremo(el superior), los elementos sólo pueden eliminarse en orden inverso al
que se insertan en la pila.
El último elemento que se introduce en la pila es el primero que se puede
sacar, debido a esto a estas estructuras se les denomina LIFO(last-in, first-out).
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
En una pila vacía no se pueden sacar datos (CIMA=0)
Si la pila se implementa con un array de tamaño fijo, se puede llenar cuando
CIMA=n, y el intento de introducir un elemento provocará un desbordamiento
de pila.
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
2.3 – Pilas
2.3 – Pilas
Para trabajar con pilas, es conveniente diseñar subprogramas de poner (push)
y quitar (pop) elementos.
1
2
3
Eliminación del nodo con valor 4:
4
1
aux
2
3
4
aux
Cima
Cima
Inserción del nodo con valor 4:
aux=cima;
elemento=cima->elem;
cima=cima<-sig;
free(aux);
aux=(struct nodo*)malloc(sizeof(struct nodo));
aux->elem=4;
aux->sig=cima;
cima=aux;
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
3
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
2.4 – Colas
2.3.1 – Aplicaciones de las Pilas
Las pilas son utilizadas para solucionar una amplia variedad de tareas del tipo
LIFO. Se utilizan en compiladores, sistemas operativos y en programas de
aplicación. Una aplicación interesante es la siguiente:
Una Cola es un tipo especial de lista lineal en la que la eliminación se realiza al
principio de la lista, frente y las inserciones se realizan al final de la lista, final.
......................................
Programa
principal
Llamar_a A
Subprograma
A
subprograma A
Eliminación
direccion X
Llamar_a B
Subprograma
B
1
2
3
n-1
frente
subprograma B
n
Inserción
final
direccion Y
Subprograma
C
fin_subprograma A
Llamar_a C
direccion Z
fin_subprograma B
Z
subprograma C
fin_subprograma C
Y
En las colas el elemento que entró primero sale primero, y el que entra último
sale último, debido a esto a estas estructuras se les denomina FIFO(first-in,
first-out).
Las colas se pueden implementar con arreglos o punteros.
X
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
2.4 – Colas
2.4 – Colas
Para trabajar con colas, es conveniente diseñar subprogramas para insertar y
sacar elementos.
1
2
3
frente
1
aux
final
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
2
aux
3
4
frente
final
aux=frente;
elemento=aux->elem;
frente=frente->sig;
free(aux);
aux=(struct nodo*)malloc(sizeof(struct nodo));
aux->sig=null;
final->sig=aux;
final=aux;
Escuela de Ingeniería
Informática
Eliminación del nodo con valor 1:
4
Inserción del nodo con valor 4:
Desarrollado por
Ricardo Soto De Giorgis
Desarrollado por
Ricardo Soto De Giorgis
ICI 241 – Estructura de Datos
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO
Escuela de Ingeniería Informática
Capítulo 2 - Estructuras Dinámicas
2.4.2 – Doble Colas
2.4.1 – Aplicaciones de las Colas
Las colas son utilizadas para solucionar una amplia variedad de tareas del tipo
FIFO. Se utilizan generalmente en sistemas donde existen recursos
compartidos. Una aplicación interesante es la siguiente:
Una Doble Cola o Bicola es un tipo especial de cola en la que las
eliminaciones y las inserciones se pueden realizar en cualquiera de los dos
extremos de la lista.
Inserción
Eliminación
......................................
Eliminación
1
2
3
frente
n-1
n
Inserción
final
Doble Cola de entrada restringida: acepta inserciones sólo al final de la cola.
Doble Cola de salida restringida: acepta eliminaciones sólo al frente de la cola.
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniería
Informática
ICI 241 – Estructura de Datos
4
Descargar