Modelo de listas

Anuncio
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
Descargar