Está en la página 1de 29

Programacin Dinmica

Algoritmos y Estructuras de Datos

Company

LOGO

Agenda

1. Punteros
2. Estructuras autoreferenciadas
3. Asignacin dinmica de memoria
4. Listas enlazadas

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.

Sirven para simular


parmetros por
referencia.

Punteros

Declarar punteros
Sintaxis

Definir *mi_puntero como Entero;

Definicin

Declara un puntero hacia un


Entero.
Se pueden definir punteros
hacia cualquier tipo de dato.

Punteros y operadores
Operador
de
direccin
(&)

Devuelve la direccin de memoria del operando

Ejemplo

Declarar un_numero como Entero;


Declarar *un_puntero como Entero;
un_numero <- 5;
un_puntero <- &un_numero;
//un_puntero obtiene la direccin de un_numero

Punteros y operadores

Punteros y operadores
Operador de
indireccin(*)

Nos permite obtener el valor almacenado en la


direccin que tiene asignada.

*un_puntero nos devolvera un_numero, dado


que un_puntero apunta hacia un_numero.

Ejemplo

Para asignar:
*un_puntero <- 7;
//Ahora el valor de un_numero es 7

El ejemplo

Punteros y Estructuras
Operador
punto (.)

Definir una_carta como carta;


Escribir una_carta.signo;

Operador
flecha (<-)

Definir *puntero_carta como carta;


puntero_carta <- &una_carta;
Escribir puntero_carta->signo;

Equivalente
a:

Escribir (*puntero_carta).signo;

Parmetros por referencia


Estructuras de Datos Dinmicas: Crecen
o se contraen durante la ejecucin
Listas
enlazadas
Inserciones y
eliminaciones
sin
restricciones.

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

Es el vnculo entre un nodo y otro.

puntero_siguiente apunta hacia un dato del tipo


nodo.

Asignacin dinmica de
memoria
Definicin

Obtiene y libera memoria durante la ejecucin del


programa.

Funcin
reservar()

Reserva memoria para un puntero.


Definir *puntero_nodo como nodo;

reservar(puntero_nodo);
Funcin
liberar()

Libera la memoria reservada por la funcin


reservar.
liberar(puntero_nodo);

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

Existen varios tipos:


Simples, dobles,
circulares, etc.

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.

Debe permitir ingresar caracteres en la lista


en orden alfabtico.
Debe permitir eliminar cualquier carcter de la
lista.

Plan de accin
El usuario ingresa una opcin

En caso la opcin sea 1, se ejecuta el


procedimiento de insercin
En caso la opcin sea 2, se ejecuta el
procedimiento de eliminacin
Slo si la lista no est vaca

En caso la opcin sea 3, se termina la


ejecucin del programa

Estructura jerrquica

Mdulo
Principal
Insertar
carcter en
orden

Eliminar
carcter

Verificar que
lista est
vaca

Mostrar
contenido de
la lista

Definir Estructuras
Nodo en Estructura nodo_lista
Lista
Enlazada
Definir caracter como

Caracter;
Definir *puntero_siguiente
como nodo_lista;
FinEstructura

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
Reservar memoria para el nuevo nodo

Ubicar entre que nodos hay que colocar


el nuevo elemento recin creado

En caso haya colocarlo en primera


posicin, hay que cambiar el valor del
puntero al primer nodo.
En caso est al medio, la insercin se
realiza modificando las direcciones de
los punteros.

Insertar elemento

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

Eliminar elemento
Funcion caracter_eliminado <- suprimir (puntero_inicio por Referencia, caracter por Valor)
Definir *puntero_previo, *puntero_actual,

*auxiliar

como nodo_lista;

Si caracter = puntero_inicio->caracter Entonces


auxiliar <- puntero_inicio;
puntero_inicio <- puntero_inicio<-puntero_siguiente;
liberar(auxiliar);
caracter_eliminado <- caracter;
Sino
puntero_previo <- puntero_inicio;

puntero_actual <- puntero_inicio->siguiente;


Mientras puntero_actual <> NULO & puntero_actual->caracter <> caracter Hacer
puntero_previo <- puntero_actual;
puntero_actual <- puntero_actual->siguiente;
FinMientras
Si puntero_actual <> NULO Entonces
auxiliar <- puntero_actual;
puntero_previo->puntero_siguiente <- puntero_actual->puntero_siguiente;
liberar(auxiliar);
caracter_eliminado <- caracter;
FinSi
FinSi
FinFuncion

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

También podría gustarte