Professional Documents
Culture Documents
Algoritmos Semana 08 - 1 Listas LSE
Algoritmos Semana 08 - 1 Listas LSE
HUANCAYO - 2022
UNIDAD II COLAS Y RECURSIVIDAD
Las listas
• Son mucho más flexibles que los arreglos
• Permiten trabajo “dinámico” con un grupo de elementos
Cuando se construye y se utiliza una lista enlazada en una
aplicación, el acceso a la lista se hace mediante una o más
referencias a los nodos (punteros o apuntadores).
Normalmente, se accede a partir del primer nodo de la lista,
llamado cabeza (head) o cabecera de la lista.
Una referencia al primer nodo se llama referencia cabeza.
En ocasiones, se mantiene también una referencia al último nodo de la lista
enlazada. El último nodo es la cola (last) de la lista, y una referencia al último
nodo es la referencia cola.
head last
TIPOS
De acuerdo a su comportamiento, los conjuntos lineales se clasifican en
• Listas, Pilas y Colas
Al insertarse un
nuevo elemento,
25
en una cierta
posición, todos los 10 5 8 25
2 2
31 31
elementos
restantes ruedan
0 1 2 3 4 5 6 7 8
En uso Desperdicio
CONTIGUAS: DECLARACION
La lista contigua
• Es un arreglo de elementos de cualquier tipo realmente es un ARRAY
• No olvidemos que hay que predefinir el máximo de nodos de la lista
Para lograr mantener control sobre la cantidad de elementos en la lista
• Debe existir una referencia que controle el ultimo elemento
• La referencia al ultimo se moverá de acuerdo a las inserciones y
eliminaciones
• La primera referencia nunca se mueve, siempre será 0
Elementos
CONTIGUA: BASICAS
last last
El índice del último elemento
debe ser un índice inválido,
un valor negativo. No
importará que el arreglo
tenga elementos pues no -1 0 1 2 3 4 5 6 7 8 9
serán tomados en cuenta.
MAX-1
void LSCont_VaciarLista(LSCont L){
L->ultimo = -1;
}
bool LSCont_EstaVacia(LSCont L){
LSCont LSCont_CrearLista(int max){
return(L.ultimo<0);
LSCont nuevalista;
}
nuevalista->Elementos =
ArrayU_Crear(max, 0); bool LSCont_EstaLlena(LSCont L){
nuevalista->ultimo = -1;
return (L.ultimo == ArrayU_Tamanio(L.Elementol)-1);
return nuevalista;
} }
void LSCont_EliminarLista(LSCont L){
ArrayU_Eliminar(&(L->Elementos)); Si la lista está llena es
porque el índice del último ha
LSCont_VaciarLista(L); llegado al verdadero último
} índice posible en el arreglo:
MAX -1
CONTIGUA: BÚSQUEDA
0 1 2 3 4 5 6 7 8 9
LSE: LISTAS SIMPLES ENLAZADAS
Es una implementación flexible y potente
C S
Contenido Enlace
Los nodos ya no son adyacentes en memoria
NODO B
• Un nodo A logra un enlace con otro nodo B,
C S
• Almacenando dentro la dirección de memoria de B
NODO A
Al insertar o eliminar un nodo ya no hay que “mover” al resto de
elementos, solo hay que enlazarlo con la lista
25
25
10 5 8 25
2 2
31 31
TDA LSE_NODO: NIVEL DE
IMPLEMENTACION
Contenido: Datos enteros, reales, o incluso, de Estructuras o clases:
Estudiante, Auto, etc....
Y además, el nodo también contiene un enlace con su nodo siguiente
• Este enlace, puede no enlazar el nodo con nadie, el nodo esta solito,
no forma parte de ninguna lista
• O puede “apuntar” a otro nodo, indicando que ese es su siguiente nodo,
formando una Lista
Modelo de una Lista Simplemente enlazada que almacena números reales. Se
menciona la cabeza (head) de la lista que es la referencia del primer nodo, y la cola
(last) de la lista, que es una referencia al último nodo es la referencia cola.
head last
Class Automovil{
class Nodo{ Nodo cabeza,
String marca;
Automovil a; // dato del elemento
String modelo;
Nodo enlace; Nodo cola;
double costo;
}
String placa;
}
Nota de programación
La referencia cabeza (y cola) de una lista enlazada, normalmente, se inicializa a
null, indica lista vacía (no tiene nodos), cuando se inicia la construcción de una
lista.
Cualquier método que se escriba para implementar listas enlazadas debe poder
manejar un referencia de cabeza (y de cola) null.
TDA LSE_NODO: OPERACIONES
Crear y Eliminar
• LSE_nodo LSE_Nodo_Crear(Generico G);
• void LSE_nodo_Eliminar (LSE_nodo p);
LSE_Nodo LSE;
header
last
LSE: BUSQUEDA LSE_nodo LSE_BuscarNodo(LSE L,
Generico G, Generico_fnComparar f){
Hay que ubicarse en el inicio: header LSE_nodo p;
for(p = L.header; p!= NULL; p = LSE_Nodo_Siguiente(p)){
E ir avanzando hasta if(f(LSE_Nodo_Contenido(p),G) ==0) return(p);
• Encontrar el nodo con la información }
buscada o return(NULL);
}
• Que ya no haya más nodos
header last
10 5 8 25 2 31
pp pp pp pp p p
p
LSE: ANTERIOR
Dada la dirección de un nodo(pos), esta función retorna la dirección del nodo La
anterior posición
p es la
Hay que “buscar” desde el header de un
nodo
El nodo buscado es aquel cuyo siguiente es igual a pos fuera de
la lista
Si el elemento buscado es el primero en la lista, no hay anterior
p
Ejemplo al
7
LSE_nodo LSE_Anterior(LSE L, LSE_nodo p){ usar el
LSE_nodo q; estado de
if(LSE_EstaVacia(L)) return NULL; LSE_Nodo
if(L.header == p) return NULL;
header last
for(q=L.header; q!=NULL;q=q->sig){
if(q->sig ==p) return(q);
10 5 8 25 2 31
}
return(NULL);
qq q qq qp q q
q q
}
LSE: PRIMERO Y ULTIMO
Se pueden obtener siempre y cuando la lista no este vacía
Retornarán la información del elemento apuntado por header y
last respectivamente.
Si la lista está vacía, tanto header como last apuntan al last = nuevo;
nuevo nodo
Si no, si es al inicio el nuevo header, es el nuevo nodo last
Si no, si es al final, el nuevo last es el nuevo nodo
nuevo
header 18
header last
nuevo
10 5 8 25 2 31
9
nuevo
header = last = nuevo:
last p->sig = nuevo; 18 Nuevo->sig = p->sig;
header
last header
header p last
nuevo
10 5 8 25 2 31
18
LSE: ELIMINAR DE LA LISTA
La lista no debe estar vacía!!, si tiene un solo elemento, dejarla vacía
10 5 8 25 2 31
}
¿Preguntas?