Sei sulla pagina 1di 37

Estructura de Datos y

Algoritmos

Tipos Inductivos
("Recursivos")

Tipos Inductivos ("Recursivos")

tienen en general cardinalidad infinita


contienen valores de "tamao
arbitrario"

Ejemplos:

nmeros naturales
listas

Tipos Inductivos ("Recursivos")

Tomemos por ello un problema para


representar estos tipos en computadoras
Concretamente: Cmo se implementan las
variables de estos tipos ?

VAR x : T

un espacio fijo en memoria con una direccin


(secuencia de bits ubicada en cierta posicin de
la memoria)
El espacio debe ser suficiente para contener
cualquier valor de tipo T

Tipos Inductivos ("Recursivos")

Si los valores de tipo T pueden ser de


tamao arbitrariamente grande,
entonces no hay espacio finito
suficiente para contener cualquier
valor de tipo T.
Por ello: slo un rango de los
naturales es representable:
([MinNat, MaxNat])

El caso de las listas

Cmo tendra que ser una variable


capaz de contener cualquier lista?

o bien infinita
o bien de tamao ajustable
(Cada lista es finita; pero la variable
debera poder crecer y contraerse al
agregar y quitar elementos de la lista)

El caso de las listas

Solucin:
La lista se extiende "hacia afuera" a
lo largo de la memoria ocupando un
nmero de variables.

El caso de las listas

Cmo ?

Ejemplo: Consideramos [1, 2, 3]


Cada elemento es representable en una
variable comn (pe: de tipo CARDINAL)

El caso de las listas

A esta informacin, hay que agregar


otra, que representa la estructura
(lineal) de la lista:

Dnde est el primer elemento ?


Dnde est el siguiente de cada
elemento ?

El caso de las listas

Si llamamos l a la lista en cuestin,


podemos representarla con una
variable l que:

indique dnde est el primer elemento


apunte a la variable que contiene el
primer elemento
contenga como valor la direccin (un
nombre, una referencia a) de la variable
que contiene el primer elemento

El caso de las listas

El caso de las listas

Necesitamos un nuevo tipo de valores !!!


Direcciones
Referencias
Nombres
indicadores (indicaciones) (en el sentido lo que
se hace con el dedo ndice o la flecha)
punteros
Debe poderse representar la lista vaca, cuyo
primer elemento no existe. Necesitamos un valor
que no apunte: NULL
Operacin: l es la variable a la que seala
(apunta) l
Notar que l no est definida para l = NIL

El caso de las listas

Adems necesitamos representar la


estructura secuencial.
Para ello, hacemos que cada
componente de la lista apunte al
siguiente:

El caso de las listas

Tenemos NODOS formados por dos


componentes (campos):

El elemento propio de la lista


(informacin)
El puntero al siguiente nodo
(posiblemente no existente)

En C podemos representar los nodos


como estructuras (struct)

El caso de las listas

Debe poderse crear y destruir


variables en forma dinmica
(mediante instrucciones de programa,
durante la ejecucin de los
programas)

Por qu ?

El caso de las listas

Debemos poder implementar


asignaciones (abstractas) como:
S := x.S
(comparar con n := n + 1)

En tal caso, la lista contenida en la


variable S se agrandara en un
elemento

El caso de las listas

En la representacin con nodos y


punteros, corresponde a crear un
nuevo nodo y agregarlo a la lista.
Por ejemplo, a la asignacin abstracta
l := 0.l corresponde:

El caso de las listas


El nuevo nodo:
debe ser creado
debe cargrsele informacin
Y, por supuesto, l debe ser actualizada
Igualmente, deben poderse destruir nodos,
correspondientemente con las operaciones que
borran elementos de listas
Tenemos pues ESTRUCTURAS DINMICAS.
Su tamao es gobernado por instrucciones de
Programa. Comparar con vectores
(ESTRUCTURAS ESTTICAS)

Tipos de punteros en C (Captulo 7)

Para cada tipo T existe el tipo de los


punteros a variables de tipo T:

POINTER TO T
(que en C se declarara: T *variable;)

Tipos de punteros en C (Captulo 7)

Notar que si p es una variable de tipo


POINTER TO T, entonces los estados
posibles de p son:

Estar apuntando a una variable de tipo T


Contener el valor NULL (tiene valor, pero
no apunta)
No tener valor (no haber recibido todava
valor)

Tipos de punteros en C (Captulo 7)

El nico literal (constante primitiva) de


cada tipo de puntero es NULL

Las operaciones asociadas a cada tipo de


puntero son:

(puntero a variable)
== (verificacin de igualdad de dos punteros, y
solo de punteros)
= (asignacin)

Tipos de punteros en C (Captulo 7)

A stas operaciones deben agregarse


las operaciones que permiten crear y
destruir variables dinmicamente

En todo contexto en que sea vlida la


importacin:
#include <stdio.h>

Tipos de punteros en C (Captulo 7)

Tomemos disponibles las siguientes


funciones (C extendido), para
cualquier tipo T:

T *variable = new(T);
delete(variable);
delete [] variable (si variable es un
arreglo)

Tipos de punteros en C (Captulo 7)

El funcionamiento de estos procedimientos es


como sigue:

p = NEW(T)

Crea una variable de tipo T (siendo p una


variable de tipo POINTER TO T)

deja p apuntando a esa nueva variable

no importando cul era el estado previo de p


DELETE(p)

Tiene como precondicin que p est apuntando a


alguna variable

La variable apuntada por p desaparece

p queda "sin valor"

Tipos de punteros en C (Captulo 7)


Observaciones Complementarias
1.

2.

Los tipos de punteros son atmicos.


Pueden ser retornados como valores
de funciones. Son usados para
formar estructuras encadenadas.
Dada una variable p: POINTER TO T
hay tres formas de asignarle valor
1.
2.
3.

p = NULL
p=q
P = NEW(T)

Asignar un valor a un puntero

p = NULL, hace que p "no apunte"

Asignar un valor a un puntero

p = q, donde q es otra variable del


mismo tipo que p. Entonces q debe
tener valor. Luego de esta asignacin,
o bien p y q son NIL (no apuntan) o
bien apuntan a la misma variable.

Asignar un valor a un puntero

p = NEW(T), es la manera de crear


punteros efectivos a variables.

Luego, necesariamente, si un puntero


apunta a una variable, sta es una
variable creada dinmicamente
(usando NEW)

Tipos de punteros en C (Captulo 7)


Observaciones Complementarias
3.

Dada la siguiente situacin:

Decimos que p, q (sus punteros) son


alias de la misma variable.

Tipos de punteros en C (Captulo 7)


Observaciones Complementarias
Qu ocurre al ejecutarse DELETE(p)?

q queda apuntando a una variable inexistente (lo cual


es diferente de contener el valor NULL, es decir: "NO
APUNTAR")
De hecho, ocurre que los contenidos de ambas
variables son intiles. O sea, la situacin es anloga
al caso en que no tienen valor asignado.

Tipos de punteros en C (Captulo 7)


Observaciones Complementarias
Qu ocurre al ejecutarse DELETE(p)?

Ejecutar p o q en esta situacin conduce a un error de


ejecucin (el mensaje suele ser SEGMENTATION
FAULT" o algo que sugiera "ausencia de variable alojada
en la direccin en cuestin")
En presencia de alias, la ejecucin de DELETE puede tener,
como efecto lateral, que ms de un puntero quede
"apuntando a una variable inexistente OJO

Tipos de punteros en C (Captulo 7)


Observaciones Complementarias
4.

Sean p, q variables de tipo POINTER


TO CHAR, tal que:

Tipos de punteros en C (Captulo 7)


Observaciones Complementarias

Que pasa si hacemos ?

[1] p = q
[2] *p = *q (esta es la notacin en C
para p y q respectivamente)

Que pasa si hacemos ?

Luego de ejecutar [1], tenemos:

(Notar tambin el desperdicio posible de


memoria luego de ejecutar [1], a queda
inaccesible y gastando memoria)

Que pasa si hacemos ?

Luego de ejecutar [2], tenemos:

Tipos de punteros en C (Captulo 7)


Observaciones Complementarias
5.

6.

NEW y DELETE son traducidos en


trminos de los procedimientos (ms
primitivos) malloc y free.
Esto explica porqu importamos los
ltimos pero usamos los primeros.

Listas Encadenadas

Veamos ahora cmo definir y usar


listas en C, haciendo uso de punteros.

Listas Encadenadas

Veamos ahora cmo definir y usar


listas en C, haciendo uso de punteros.

Potrebbero piacerti anche