Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Company
LOGO
Agenda
1.
1.Punteros
Punteros
2.
2. Estructuras
Estructurasautoreferenciadas
autoreferenciadas
3.
3.Asignacin
Asignacindinmica
dinmicade
dememoria
memoria
4.
4.Listas
Listasenlazadas,
enlazadas, Pilas
PilasyyColas
Colas
Punteros
Su valor es una
direccin de
memoria.
Las variables
normales contienen
un valor especfico.
Los punteros
almacenan la
direccin de una
variable que tiene
un valor especfico.
Punteros
Declarar punteros
Sintaxis
Definicin
Punteros y operadores
Operador
de
direccin
(&)
Ejemplo
Punteros y operadores
Punteros y operadores
Operador de
indireccin(*)
Ejemplo
Para asignar:
*un_puntero <- 7;
//Ahora el valor de un_numero es 7
El ejemplo
Punteros y Estructuras
Operador
punto (.)
Operador
flecha (<-)
Equivalente
a:
Escribir (*puntero_carta).signo;
Estructuras de Datos
Dinmicas
Pilas
Colas
Inserciones y Inserciones
eliminaciones
en la parte
slo en la
posterior y
parte superior.
eliminaciones
en la parte
superior.
rboles
binarios
Bsqueda y
ordenamiento
de alta
velocidad y
eliminacin de
duplicados
eficiente
Estructura auto-referenciada
Contienen un
puntero a otra
estructura
Esta otra
estructura es del
mismo tipo.
Lo que permite
formas
estructuras de
datos.
Pueden
enlazarse
mutuamente.
Estas
estructuras
terminan con un
puntero NULO.
Estructura auto-referenciada
Estructura auto-referenciada
Sintaxis
Estructura nodo
Definir dato como Entero;
Definir *puntero_siguiente como nodo;
FinEstructura
Enlace
Asignacin dinmica de
memoria
Definicin
Funcin
reservar()
Funcin
liberar()
Listas enlazadas
Coleccin lineal de estructuras autoreferenciadas, llamadas nodos, conectadas
por enlaces mediante punteros.
Se acceden
Los
El ltimo
mediante
siguientes
elemento
un puntero
nodos se
tiene como
al primer
acceden a
enlace un
elemento
travs de
puntero
de la lista. los enlaces.
NULO.
Listas enlazadas
A diferencia de un
vector, soporta un
nmero indeterminado
de elementos.
A diferencia de un
vector, es fcil
mantenerla ordenada.
Nosotros trabajaremos
con LISTAS
ENLAZADAS SIMPLES
Comienzan con un
puntero al primer nodo,
terminan en puntero
nulo y se recorren en
una direccin
Un problema
Disee un algoritmo que permita
manipular una lista de caracteres.
Plan de accin
El usuario ingresa una opcin
Estructura jerrquica
Mdulo
Principal
Insertar
carcter en
orden
Eliminar
carcter
Verificar que
lista est
vaca
Mostrar
contenido de
la lista
Definir Estructuras
Nodo en
Lista
Enlazada
Estructura nodo_lista
Definir *puntero_siguiente
FinEstructura
como nodo_lista;
Mdulo Principal
Proceso principal
Definir *puntero_inicio como nodo_lista;
//Variables para opcin y caracteres ingresados
Leer opcion;
Mientras opcion <> 3 Hacer
Segun opcion Hacer
1:
Leer caracter_ingresado;
insertar(puntero_inicio, caracter_ingresado);
2:
es_una_lista_vacia <- esta_vacia(puntero_inicio);
Si ~es_una_lista_vacia Entonces
Leer caracter_ingresado;
caracter_eliminado <- suprimir(puntero_inicio, caracter_ingresado);
FinSi
FinSegun
Leer opcion;
FinMientras
FinProceso
Insertar elemento
Insertar elemento
Reservar memoria para el nuevo nodo
Insertar elemento
SubProceso insertar (puntero_inicio por Referencia, caracter por Valor)
Definir *puntero_nuevo como nodo_lista;
Definir *puntero_previo como nodo_lista;
Definir *puntero_actual como nodo_lista;
reservar(puntero_nuevo);
puntero_nuevo->caracter <- caracter;
puntero_nuevo->puntero_siguiente <- NULO;
puntero_previo <- NULO;
puntero_actual <- puntero_inicio;
Mientras (puntero_actual <> NULO & caracter > puntero_actual->caracter) Hacer
puntero_previo <- puntero_actual;
puntero_actual <- puntero_actual->puntero_siguiente;
FinMientras
Si puntero_previo = NULO Entonces
puntero_nuevo->puntero_siguiente <- puntero_inicio;
puntero_inicio <- puntero_nuevo;
Sino
puntero_previo->puntero_siguiente <- puntero_nuevo;
puntero_nuevo->puntero_siguiente <- puntero_actual;
FinSi
FinSubProceso
Eliminar elemento
Eliminar elemento
La eliminacin implica remover los enlaces al nodo
a eliminar
Al eliminar, necesitamos liberar la memoria
reservada para el nodo eliminado.
Si el carcter a eliminar est en la primera
posicin, es necesario cambiar el puntero al primer
nodo.
Debemos informar al programa si el nodo a
eliminar fue encontrado en la lista.
Eliminar elemento
Funcion caracter_eliminado <- suprimir (puntero_inicio por Referencia, caracter por Valor)
Definir *puntero_previo, *puntero_actual,
*auxiliar
como nodo_lista;
Mostrar contenido
SubProceso mostrar_lista(puntero_actual)
Si puntero_actual = NULO Entonces
Escribir "La lista est vaca";
Sino
Mientras puntero_actual <> NULO Hacer
Escribir puntero_actual->caracter, "-->", Sin Saltar;
puntero_actual <- puntero_actual->puntero_siguiente;
FinMientras
Escribir "NULO";
FinSi
FinSubProceso
Est vaca?
Funcion resultado <- esta_vacia(puntero_inicio)
FinFuncion
Pilas
Como en los
platos en un
Buffet
Modo de
acceso: LIFO
La base de la
pila es un
enlace a NULO.
En conclusin,
es una lista
enlazada con
restricciones
Pilas
Apilar
Desapilar
Mdulo
Principal
Apilar
Desapilar
Verificar si
est vaca
Mostrar en
pantalla
Pilas
Definir Estructuras
Nodo
en
Pila
Estructura nodo_pila
Definir *puntero_siguiente
FinEstructura
como nodo_pila;
Mdulo Principal
Proceso principal
Definir *puntero_pila como nodo_pila;
//Declarar variables adicionales
puntero_pila <- NULO;
Leer opcion;
Mientras opcion <> 3 Hacer
Segun opcion Hacer
1:
Leer valor_ingresado;
apilar(puntero_pila, valor_ingresado);
mostrar_pila(puntero_pila);
2:
Si ~esta_vacia(puntero_pila) Entonces
Escribir desapilar(puntero_pila);
FinSi
mostrar_pila(puntero_pila);
FinSegun
Leer opcion;
FinMientras
FinProceso
Apilar elemento
Apilar elemento
SubProceso apilar (puntero_pila Por Referencia, dato
por Valor)
Definir *puntero_nuevo como nodo_pila;
reservar(puntero_nuevo);
puntero_nuevo->dato <- dato;
puntero_nuevo->puntero_siguiente <- puntero_pila;
puntero_pila <- puntero_nuevo;
FinSubProceso
Des-apilar elemento
Des-apilar elemento
SubProceso desapilar(puntero_pila por Referencia)
Definir *auxiliar como nodo_pila;
Definir valor_desapilado como Entero;
auxiliar <- puntero_pila;
valor_desapilado <- puntero_pila->dato;
puntero_pila <- puntero_pila->puntero_siguiente;
liberar(auxiliar);
FinSubProceso
Mostrar Pila
SubProceso mostrar_pila(puntero_actual)
Si puntero_actual = NULO Entonces
Escribir "La pila est vaca \n";
Sino
Escribir "Contenido de la pila: ";
Mientras puntero_actual <> NULO Hacer
Escribir puntero_actual->dato, "-->";
puntero_actual <- puntero_actual->puntero_siguiente;
FinMientras
Escribir "NULO";
FinSi
FinSubProceso
Est vaca?
Funcion resultado <- esta_vacia(puntero_inicio)
FinFuncion
Colas
Imaginen un
cajero de
supermercado.
Modo de
acceso: FIFO.
Los nodos se
ingresan slo al
final.
La base de la
pila es un
enlace a NULO.
Colas
Encolar
Desencolar
Mdulo
Principal
Encolar
Desencolar
Verificar si
est vaca
Mostrar en
pantalla
Colas
Definir Estructuras
Nodo
en
Cola
Estructura nodo_cola
FinEstructura
Mdulo Principal
Proceso principal
Definir *puntero_inico como nodo_cola;
Definir *puntero_fin como nodo_cola;
//Declarar variables adicionales
puntero_inicio <- NULO;
puntero_fin <- NULO;
Leer opcion;
Mientras opcion <> 3 Hacer
Segun opcion Hacer
1:
Leer valor_ingresado;
encolar(puntero_inicio, puntero_fin, valor_ingresado);
mostrar_contenido(puntero_inicio);
2:
Si ~esta_vacia(puntero_inicio) Entonces
Escribir desencolar(puntero_inicio, puntero_fin);
FinSi
mostrar_contenido(puntero_inicio);
FinSegun
Leer opcion;
FinMientras
FinProceso
Encolar
Encolar
Reservamos memoria para el nuevo nodo
Encolar
SubProceso encolar(puntero_inicio Por Referencia, puntero_fin Por Referencia, dato Por
Valor)
Definir *puntero_nuevo como nodo_cola;
reservar(puntero_nuevo);
puntero_nuevo->dato <- dato;
puntero_nuevo->puntero_siguiente <- NULO;
Si esta_vacia(puntero_inicio) Entonces
puntero_inicio <- puntero_nuevo;
Sino
puntero_fin->puntero_siguiente <- puntero_nuevo;
FinSi
puntero_fin <- puntero_nuevo;
FinSubProceso
Desencolar
Desencolar
Extraer el dato del primer nodo de la cola.
Mostrar contenido
SubProceso mostrar_contenido(puntero_actual)
Si puntero_actual = NULO Entonces
Escribir "La cola est vaca";
Sino
Escribir "La cola contiene: ";
Mientras puntero_actual <> NULO Hacer
Escribir puntero_actual->dato, " --> ";
puntero_actual <- puntero_actual->puntero_siguiente;
FinMientras
Escribir " NULO";
FinSi
FinSubProceso
Est vaca?
Funcion resultado <- esta_vacia(puntero_inicio)
FinFuncion
Un Problema
Para un grupo de n productos se desea
almacenar en una LISTA los siguientes datos:
cdigo, descripcin, cantidad solicitada, cdigo
de cliente.
Luego en base a la LISTA, se pide presentar un
listado que muestre el cdigo del producto,
descripcin y cantidad total solicitada, ordenado
en forma creciente respecto al cdigo.
Nota: En la LISTA algunos productos se
pueden repetir
Un problema
Productos de Entrada:
Cdigo
Descripcin
Cantidad
Cdigo de Cliente
201
Lpiz
500
820
105
Borrador
100
515
201
Lpiz
100
806
Reporte de Salida:
Cdigo
Descripcin
Cantidad
105
Borrador
100
201
Lpiz
600
Plan de accin
Definir estructuras de datos
Definir Estructuras
Venta
Estructura venta
Definir codigo_producto como Entero;
Dimension descripcion[50];
Definir descripcion como Caracter;
Definir cantidad como Entero;
Definir codigo_cliente como Entero;
FinEstructura
Nodo
en la
Lista
Estructura nodo_lista
Definir dato como venta;
Definir *puntero_siguiente como nodo_lista;
FinEstructura
Mdulo
Principal
Registrar
venta
Mostrar
reporte
Mdulo principal
Proceso principal
Definir numero_ventas como Entero;
Definir contador_ventas como Entero;
Definir *puntero_inicio como nodo_lista;
Definir informacion_ingresada como venta;
puntero_inicio <- NULO;
Leer numero_ventas;
Para contador_ventas <- 0 Hasta numero_ventas - 1 Hacer
Leer informacion_ingresada.codigo_producto;
Leer informacion_ingresada.descripcion;
Leer informacion_ingresada.cantidad;
Leer informacion_ingresada.codigo_cliente;
registrar_venta(puntero_inicio, informacion_ingresada);
FinPara
mostrar_reporte(puntero_inicio);
FinProceso
Registrar venta
SubProceso registrar_venta(puntero_inicio Por Referencia,
informacion_ingresada por Valor)
Definir *puntero_previo como nodo_lista;
Definir *puntero_actual como nodo_lista;
Definir *puntero_nuevo como nodo_lista;
reservar(puntero_nuevo);
puntero_nuevo->dato <- informacion_ingresada;
puntero_nuevo->puntero_siguiente <- NULO;
puntero_previo <- NULO;
puntero_actual <- puntero_inicio;
Mientras puntero_actual <> NULO &
informacion_ingresada.codigo_producto > (puntero_actual->dato).codigo_producto Hacer
puntero_previo <- puntero_actual;
puntero_actual <- puntero_actual->puntero_siguiente;
FinMientras
Si puntero_previo = NULO Entonces
puntero_nuevo->puntero_siguiente <- puntero_inicio;
puntero_inicio <- puntero_nuevo;
Sino
puntero_previo->puntero_siguiente <- puntero_nuevo;
puntero_nuevo->puntero_siguiente <- puntero_actual;
FinSi
FinSubProceso
Mostrar reporte
SubProceso mostrar_reporte(puntero_inicio)
Definir informacion_venta como venta;
Definir informacion_previa como venta;
Si puntero_actual <> NULO Hacer
informacion_previa <- puntero_actual->dato;
puntero_actual <- puntero_actual->puntero_siguiente;
Mientras puntero_actual <> NULO Hacer
informacion_venta <- puntero_actual->dato;
Si informacion_venta.codigo_producto = informacion_previa.codigo_producto Hacer
informacion_previa.cantidad <- informacion_previa.cantidad +
informacion_venta.cantidad;
Sino
Escribir informacion_previa.codigo_producto,
informacion_previa.descripcion, informacion_previa.cantidad;
informacion_previa <- informacion_venta;
FinSi
puntero_actual <- puntero_actual->puntero_siguiente;
FinMientras
Escribir informacion_previa.codigo_producto, informacion_previa.descripcion,
informacion_previa.cantidad;
FinSi
FinSubProceso