Estructuras de datos En la programación de computadoras existen modelos que resultan de manera natural al ingresar datos a la computadora. Uno de ellos es el modelo de listas. Dicho modelo es el que resulta del simple hecho de capturar información para su almacenamiento y consulta posterior. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas 1 2 n Lista implementada con un arreglo Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Existen diferentes formas de implementar dicho modelo en la memoria de la computadora. El más simple es por medio de un arreglo. Los arreglos tienen manera de proporcionar las caracteristicas principales del modelo. Una lista se compone de elementos homogeneos que guardan una posición lineal entre si. Asi pues al hablar de la posición hablamos de una referencia que usualmente marca el inicio de la lista. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Estructuras de datos 0 Estructuras de datos Estructuras de datos Las operaciones básicas con listas son las siguientes: • Elemento(Lista, Posición) .- Devuelve el elemento de Lista en la Posición indicada. • Inserta(Elemento, Posición, Lista) .- Inserta un Elemento en la Posición indicada en la Lista. • Elimina(Posición, Lista) .- Elimina un Elemento en la Posición indicada en la Lista. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas 1 Estructuras de datos Adicionalmente se acostumbra añadir las siguientes: • Vacía(Lista) .- Devuelve verdadero si la Lista esta vacía. • Llena(Lista) .- Devuelve verdadero si la Lista esta llena. • Miembro(Elemento, Lista) .- Devuelve verdadero si el Elemento se encuentra en la Lista. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Estructuras de datos Considerando la implementación por medio de un arreglo, la función Elemento es relativamente fácil de implementar debido a que la mayoria de los lenguajes de alto nivel proporcionan los medios para hacerlo. Por lo regular solo tiene que indicarse la posición del arreglo por medio de un indice y con ello tenemos acceso a los elementos del mismo. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Estructuras de datos La complicación se presenta a la hora de implementar las operaciones de inserción y eliminación. En ambos casos, es necesario recorrer los elementos posteriores al elemento que deseamos insertar o eliminar. También resulta obvio que el caso más simple se presenta cuando deseamos insertar o eliminar del final de la lista. En la siguiente lámina se presenta un ejemplo de la operación de inserción a la mitad de la lista. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Estructuras de datos a b d 0 1 2 n a b c 0 1 2 3 d n El elemento “d” se recorrio de la posición 2 a la 3 para dar cabida al elemento “c” y asi conservar el orden de la lista. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas 2 Estructuras de datos Las operaciones de llena y vacia requieren tener conocimiento del inicio y el final de la lista. En el caso de un arreglo, el inicio de la lista será siempre el indice cero del mismo y la posición final es el indice que corresponde al numero de elementos en la lista menos uno. Asi para saber si una lista esta vacía es necesario definir un valor que sirva de marca indicando que una cierta posición esta vacía. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Estructuras de datos Puede ser un numero negativo si se trata de una lista de enteros positivos o el carácter nulo si almacenamos caracteres. En general cualquier dato que no pertenezca al conjunto de datos que van a almacenarse en la lista. Para implementar la función de vacia, basta con revisar si la posición inicial de la lista esta vacía (asumiendo que crece a partir del inicio), y para implementar la función llena basta con revisar si la lista contiene el numero máximo de elementos. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Estructuras de datos En el caso de la función de membresía puede hacerse una búsqueda binaria para resolver el problema. En las siguientes laminas se muestra la realización de algunas de estas funciones. Estructuras de datos /* Programa que implementa la inserción y la función miembro */ #include <stdio.h> #define TAM 10 typedef struct{ int dato; }ELEMENTO; ELEMENTO Lista[TAM]; Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas 3 Estructuras de datos void inserta(ELEMENTO x, int POSICION, ELEMENTO *L){ int i; for ( i = TAM - 1; i > POSICION; i--) L[i] = L[i - 1]; L[POSICION] = x; } int miembro(ELEMENTO x, ELEMENTO *L){ int i; for(i = 0; i < TAM; i++) if ( L[i].dato == x.dato) return 1; return 0; } Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Estructuras de datos • LOCALIZA(x, L) devuelve la posición del elemento x dentro de la lista L. Si x no existe en L, entonces se devuelve FIN(L). • RECUPERA(p, L) devuelve el elemento que se encuentra en la posición p de la lista L. • SUPRIME(p, L) esta función elimina el elemento que se encuentra en la posición p de L. El resultado esta indefinido si L no tiene posición p o p = FIN(L). Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Estructuras de datos Una conjunto más completo de las operaciones con una lista aparece a continuación: Aquí se considera L de tipo lista, x de tipo elemento y p de tipo posición. • FIN(L) devuelve la posición despúes del último elemento de la lista L. • INSERTA(x, p, L) inserta un elemento x en la posicion p en la lista L. Si p no existe el resultado es indefinido. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Estructuras de datos • SIGUIENTE(p, L) y ANTERIOR(p, L) devuelven el elemento siguiente y anterior a la posición p en la lista L. No estan definidas SIGUIENTE( FIN(L), L) y ANTERIOR(PRIMERO(L), L). • ANULA(L) convierte a L en una lista vacía y devuelve la posición FIN(L). • PRIMERO(L) devuelve la posición del primer elemento de la lista L. En caso de tratarse de una lista vacía se devuelve FIN(L). Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas 4 Estructuras de datos • IMPRIME_LISTA(L) imprime los elementos de la lista L en su orden de aparición. En las siguientes láminas se discutirá una realización de dichas listas con arreglos de una manera más completa. Estructuras de datos #define TAM 10 typedef int POSICION; typedef int ELEMENTO; typedef int BOOLEAN; typedef struct{ ELEMENTO elementos[TAM]; POSICION ultimo; } LISTA; Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Estructuras de datos void INSERTA(ELEMENTO x, POSICION p, LISTA *L){ POSICION q; if (LLENA(L)) printf(“Error la lista esta llena\n”); else if (p > FIN(L) || p >= TAM – 1) printf(“Error la posicion no existe\n”); else{ for(q = FIN(L); q > p; q--) L->elementos[q] = L->elementos[q-1]; L->ultimo = L->ultimo + 1; L->elemento[p] = x; } } Esta función requiere de las declaraciones de la siguiente lámina. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Estructuras de datos LISTA milista; milista.ultimo = -1; BOOLEAN LLENA(LISTA *L){ if(FIN(L) == TAM) return 1; else return 0; } POSICION FIN(LISTA *L){ return L->ultimo + 1; } Del mismo modo pueden realizarse las funciones suprime y localiza. Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas 5 Estructuras de datos void SUPRIME(POSICION p, LISTA *L){ POSICION q; if(p > L->ultimo || VACIA(L) || p < 0) printf(“La posicion no existe\n”); else{ L->ultimo = L->ultimo – 1; for( q = p; q <= ultimo; q++) L->elementos[q] = L->elementos[q+1]; } } Estructuras de datos POSICION LOCALIZA(ELEMENTO x, LISTA *L){ POSICION q; for( q = 0; q <= L->ultimo; q ++) if ( L->elementos[q] = = x )break; return q; } BOOLEAN VACIA(LISTA *L){ if( L->ultimo == -1) return 1; else return 0; } Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas Ing. Ing.Jorge JorgeA. A.Hernández HernándezP.: P.:Modelo Modelode delistas listas 6