Anda di halaman 1dari 54

Estructura de Datos y

Algoritmos

Repaso Tipos de Datos

Qu es un dato?

Informacin en bruto, sin ningn significado

Dado un enunciado, evento o accin, los datos

Permiten representar sus actores o participantes

Analizndolos, se podr obtener resultados deseados

Analicemos el siguiente hecho:

El estudiante Juan Paz de edad 23 aos, tiene promedio 8.3 en sus


calificaciones

Podemos tomar los siguientes datos

Nombre: Juan Paz

-> Conjunto de Caracteres

Edad: 23

-> entero

Promedio: 78,3

-> real

Como representar los datos


Los

seres humanos:

Usamos lenguaje natural o smbolos


Ejemplo:

Para representar nmeros, usamos el sistema decimal


Para representar palabras, usamos el abecedario

La

computadora:

Usa conjuntos de 1s y 0s
El dato mas pequeo en el computador es

Un 1 o un 0 -> bit

El conjunto de 8 bits -> 1 byte

Como representar los datos


Los

datos se clasifican en TIPOS

Son

los diferentes dominios existentes.


Ejemplo:

Edad, Ao de Nacimiento, Numero de multas

Nombre, Direccin, Num. Cedula,

Tienen dominio numrico


Caen en el dominio de la informacin tipo texto

las operaciones permitidas para dicho


dominio

Tipos de Datos Bsicos


NOMBRE

CONJUNTO DE VALORES

OPERACIONES

Enteros

Negativos y positivos sin decimal

Sumar, restar, dividir, multiplicar,


residuo

Reales

Negativos y positivos, con


decimal

Sumar, restar, dividir, multiplicar

Lgicos

Verdadero o Falso(1 o 0)

And, Or, Not

Caracteres

Letras, nmeros, especiales,


juntos forman una cadena

Sumar carcter + entero restar,


multiplicar por entero

En la computadora

1000
1001
Solo vienen integrados los tipos de datos bsicos 1002
En la computadora
1003
Cada byte es un casillero y tiene una direccin en
memoria
Los datos (nmeros y letras) se almacena en estos
casilleros
Cuantas casilleros ocupa un dato?
Depende de su tipo y del hardware de la computadora
Un entero puede ocupar casillas de hasta 4 bytes
Un doble siempre ocupara mas, por su mayor precisin
PERO, un carcter SIEMPRE ocupara casillas de 1 byte

Declaracin de variables en C

Una declaracin de variables en C incluye

Tipo de dato y

Nombre de variable(identificador)

Ejemplo:
int a, b;
float c;

int a;
char c;

Para que se declaran variables?

Especifica cuanta memoria debe reservarse y

Como se van a interpretar dichos datos


f = a + b

Es una suma de enteros, que al final se convierte a real

100
101
102
103
104

4 bytes,
dir: 100

1 byte,
dir: 104

Direcciones de Memoria

Las variables

Si deseamos conocer dicha direccin

Tienen direcciones de memoria


En lenguaje C
Se usa el operador & de direccin

1000
1001
1002
1003

Ejemplo:
int a;
a = 3;
printf(Valor:%d Dir: %d, a, &a);

Un puntero

Es una variable que puede almacenar direccin


de memoria

&a es
1000

Estructura de Datos y
Algoritmos

Repaso Estructuras de
Datos

Qu es una Estructura de Datos?

Una estructura de datos es una forma de organizar


un conjunto de datos elementales con el objetivo de
facilitar su manipulacin. Un dato elemental es la
mnima informacin que se tiene en un programa.
(ejemplos de datos elementales seran int, float,
char,etc)

Lo que se pretende con las estructuras de datos es


facilitar un esquema lgico para manipular los datos
en funcin del problema que haya que tratar y el
algoritmo para resolverlo.

Qu es una Estructura de Datos?

En algunos casos la dificultad para resolver un


problema radica en escoger la estructura de datos
adecuada. Y, en general, la eleccin del algoritmo y de
las estructuras de datos que manipular estarn muy
relacionadas.

Ejemplos de estructuras de datos

Vectores (matriz o array)


Listas Enlazadas
Pilas (stack)
Colas (queue)
rboles
rboles Binarios
rboles finitarios
Conjuntos (set)
Grafos
Tablas Hash

Estructura de Datos y
Algoritmos

Tipos Inductivos

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 ?

T x;//T es el tipo de la variable x


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?
infinita
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 (ej.: 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 a la lista en cuestin, podemos


representarla con una variable que:
indique dnde est el primer elemento, o sea que
apunte a la variable que contiene el primer
elemento, que es lo mismo que
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)
punteros
Debe poderse representar la lista vaca, cuyo primer
elemento no existe. Necesitamos un valor que no
apunte.Este valor se conoce como NULL .
Operacin: es la variable a la que seala
(apunta)
Notar que no est definida para l = NULL

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 (operacin que agrega un elemento a la lista)
(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 (antes de
la asignacin l=[1,2,3]) corresponde:

El caso de las listas


El nuevo nodo:
debe ser creado
debe cargrsele informacin
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. Esto no pasa con estructuras estticas como
son los arreglos.

Listas Encadenadas

Estructura de Datos y
Algoritmos

Repaso Punteros

Punteros en C

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

Punteros en C

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)

Punteros en C

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)

Punteros en C

Un tipo de dato

El puntero solo podr almacenar direcciones de


memoria de variables del tipo especificado

Se pueden definir punteros de cualquier tipo:

float *pf;
char *pc;

1000
1001

1000
1000 pt

Un identificador que siempre va antecedido del


operador *
int *pt, x;
x = 3;
pt = &x;

1003
1005

pt almacena la
direccin de x, se
dice que pt apunta
ax

Punteros en C

Un puntero apunta a una variable

A travs del puntero se puede llegar a conocer todo sobre la


variable
char c, *pc1, *pc2;
Ejemplo:

pc1 = &c;

Si quiero conocer la direccin, uso el puntero


printf(%d, pc1); //Imprimo la dir. Almacenada por pc1
pc2 = pc1; //pc2 almacena la misma dir. que pc1

Si quiero conocer el contenido al que apunta un puntero,


Es equivalente a :
uso el operador *, sobre dicho puntero
printf(%c, c);
c = A
printf(%c, *pc1);
*pc1 = N
printf(%c,c);

Es equivalente a :
c = N
Imprime N pues c ya
cambio

Punteros en C

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>

Punteros en C
Tomemos

disponibles las siguientes


funciones (C extendido), para cualquier
tipo T:
T

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

Punteros en C

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"

Punteros en C
1.

Los tipos de punteros son atmicos. Pueden ser


retornados como valores de funciones. Son usados
para formar estructuras encadenadas.

2.

Dada una variable T *p hay tres formas de asignarle


valor
1. p = NULL;
2. p = q;
3. 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 NULL (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)

Punteros en C
Observaciones Complementarias
3.

Dada la siguiente situacin:

Decimos que p, q (sus punteros) son alias


de la misma variable.

Punteros en C
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.

Punteros en C
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

Punteros en C
4.

Sean p, q variables de tipo char*, tal


que:

Punteros en C

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:

Punteros en C

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.

Referencias
http://www.fing.edu.uy/inco/cursos/prog2
www.dspace.espol.edu.ec/bitstream/.../1

.Tipos%20de%20Datos.ppt

Bibliografa

Wirth,

N. Algoritmos y Estructuras de
Datos. Prentice-Hall. 1987.

FIN
Preguntas?

Anda mungkin juga menyukai