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