Listas simples

Anuncio
Estructuras de datos
Antes de analizar la implementación de listas por
medio de apuntadores es necesario hacer uso de
cierta notación que nos será útil para comprender su
comportamiento.
En las siguientes láminas se muestra la
representación gráfica de una estructura y la manera
de usarla para construir una lista.
Estructuras de datos
Primero vamos a declarar una estructura llamada
NODO.
typedef struct{
int dato;
NODO *siguiente;
}NODO;
NODO
dato
NODO *inicio, *nuevo;
inicio = nuevo = NULL;
siguiente
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
Estructuras de datos
• La estructura la representamos gráficamente por
medio de un rectángulo divido de la misma forma
que los campos de la estructura.
• Un apuntador lo representamos por medio de una
flecha.
• El nombre lo de la estructura la hemos puesto
como etiqueta en la parte superior del rectángulo.
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
Estructuras de datos
Usando las declaraciones de los apuntadores inicio y
nuevo haremos la implementación de nuestra lista
por medio de apuntadores.
Primero deberemos crear un nodo de manera
dinámica:
nuevo = (NODO *)malloc(sizeof(NODO));
Después es necesario asegurarse si la memoria fue
asignada correctamente:
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
Estructuras de datos
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
Estructuras de datos
Después es necesario asegurarse si la memoria fue
asignada correctamente:
if (nuevo == NULL){
fprintf(stderror, “Memoria insuficiente\n”);
exit(1);
}
nuevo
inicio
Cumplido el requisito anterior, ya podemos marcar
el inicio y el final de la lista como:
NULL
inicio = nuevo;
nuevo->siguiente = NULL;
La siguiente lámina muestra el proceso de manera gráfica.
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
1
Estructuras de datos
Estructuras de datos
La inserción de un nuevo nodo requiere de una
nueva llamada a malloc.
if ((nuevo = (NODO *)malloc(sizeof(NODO))) == NULL) {
fprintf(stderror, “Memoria insuficiente\n”);
exit(1);
}
inicio
NULL
Para unir el nodo anterior con el nuevo nodo tenemos lo
siguiente:
inicio->siguiente = nuevo;
nuevo->siguiente = NULL;
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
Estructuras de datos
Estructuras de datos
Una función inserta con el comportamiento anterior
quedaría como sigue:
Una función para eliminar un nodo quedaría como
sigue:
void inserta(NODO *L){
NODO *ultimo, *nuevo;
if ((nuevo = (NODO *)malloc(sizeof(NODO))) == NULL) {
fprintf(stderror, “Memoria insuficiente\n”);
exit(1);
}
nuevo->siguiente = NULL;
if ( L == NULL) L = nuevo; //Lista vacia
else{//Lista no vacia
while(ultimo->siguiente != NULL) ultimo = ultimo->siguiente;
ultimo->siguiente = nuevo;
}
}
void elimina(NODO *L){
NODO *ultimo = L;
if ( L != NULL) {
if (L ->siguiente == NULL)
free(L);
L = NULL;
}
else{
while(ultimo->siguiente->siguiente != NULL) ultimo = ultimo->siguiente;
free(ultimo->siguiente);
utimo->siguiente = NULL;
}
}
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
Estructuras de datos
else{
fprintf(“Error la lista esta vacía\n”);
exit(1);
}
Estructuras de datos
Para la función inserta:
}
inicio
En la siguiente lámina puede verse una representación gráfica
del comportamiento de las dos funciones.
nuevo
NULL
NULL
ultimo
Después de insertar:
NULL
inicio
ultimo
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
2
Estructuras de datos
Para la función elimina:
inicio
NULL
ultimo
Después de eliminar:
inicio
NULL
Estructuras de datos
Resulta evidente que las cosas serían mas sencillas si
tuviesemos un apuntador que en todo momento
señalara el fin de la lista del mismo modo que existe
uno que señala el inicio.
Este enfoque es el que se usa comúnmente. Además
se tienen las funciones llena y vacía que se tenían en
el caso de la inmplementación con arreglos.
ultimo
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
Estructuras de datos
Tarea 3: Realizar el conjunto de operaciones con
listas implementandolas con arreglos y con
apuntadores. Tomar la lista de las láminas de modelo
de listas. Entregar el sábado 16 de marzo.
Ing.
Ing.Jorge
JorgeA.
A.Hernández
HernándezP.:
P.:Listas
Listassimples
simples
3
Descargar