Sei sulla pagina 1di 11

Estructura de datos

Una estructura de datos define la organizacin e interrelacin de stos y un conjunto


de operaciones que se pueden realizar sobre ellos. Las operaciones bsicas son:
Alta, adicionar un nuevo valor a la estructura.
Baja, borrar un valor de la estructura.
Bsqueda, encontrar un determinado valor en la estructura para realizar una
operacin con este valor, en forma !"U!#"$%L o &$#%'$( )siempre y cuando los
datos estn ordenados*...
(tras operaciones que se pueden realizar son:
(rdenamiento, de los elementos pertenecientes a la estructura.
%pareo, dadas dos estructuras originar una nueva ordenada y que contenga
a las apareadas.
"ada estructura ofrece ventajas y desventajas en relacin a la simplicidad y
eficiencia para la realizacin de cada operacin. +e esta forma, la eleccin de la
estructura de datos apropiada para cada problema depende de factores como la
frecuencia y el orden en que se realiza cada operacin sobre los datos.
Tipos de Datos
Binarios
o Bit: !l bit es la unidad m,nima de informacin empleada en
informtica, en cualquier dispositivo digital, o en la teor,a de la informacin. "on l,
podemos representar dos valores cuales quiera, como verdadero o falso, abierto o
cerrado, blanco o negro, norte o sur, masculino o femenino, rojo o azul, etc.
o Byte: Un byte debe ser considerado como una secuencia de bits
contiguos, cuyo tama-o depende del cdigo de informacin o cdigo de caracteres
en que sea definido. La unidad byte no tiene s,mbolo establecido
internacionalmente, aunque en pa,ses anglosajones es frecuente B mientras que en
los francfonos es O )de octet*. la $( y la $!" en la norma /0000123:400/
recomiendan restringir el empleo de esta unidad a los octetos )bytes de / bit*.
Numricos
o Entero: es un tipo de dato que puede representar un subconjunto finito
de los n5meros enteros. !l n5mero mayor que puede representar depende del
tama-o del espacio usado por el dato y la posibilidad )o no* de representar n5meros
negativos. Los tipos de dato entero disponibles y su tama-o dependen del lenguaje
de programacin usado as, como la arquitectura en cuestin.
o Real: !l tipo de dato real define un conjunto de n5meros que pueden ser
representados con la notacin de coma flotante.
%l igual que los n5meros enteros, el tipo real est limitado superior e inferiormente
seg5n la cantidad de memoria que 6aya disponible para almacenarlo. (tro elemento
importante a tener en cuenta en este tipo de datos es la precisin con que pueden
representar n5mero con decimales )cuantos decimales se pueden representar*, esta
caracter,stica tambin est directamente relacionada con la cantidad de memoria
disponible para almacenar un valor real.
Coma fija: !stos sistemas consisten en destinar una cantidad fija de
d,gitos para la parte entera y otra para la parte fraccionaria. La cantidad de d,gitos
destinados a la parte fraccionaria indica en definitiva la posicin de la coma dentro
del n5mero. !sta posicin. que es siempre fija. la podemos indicar con un factor de
escala impl,cito que ubica la coma en el lugar requerido. !s decir, podemos
representar un n5mero fraccionario como un n5mero entero multiplicado por un
factor de escala.
Coma flotante: es un mtodo de representacin de n5meros reales que
se puede adaptar al orden de magnitud del valor a representar, usualmente
trasladando la coma decimal 7mediante un e8ponente7 6acia la posicin de la
primera cifra significativa del valor.
+e esta forma, con un n5mero dado de d,gitos representativos se obtiene mayor
precisin que con la coma fija, debido a que el valor de estos d,gitos es siempre
significativo sea el que sea el orden de magnitud del n5mero a representar. +ebido
a esta adaptacin, permite representar un rango muc6o mayor de n5meros
)determinado por los valores l,mite que puede tomar el e8ponente*.
Alfanumricos
o Carcter: es una unidad de informacin que corresponde
apro8imadamente con un grafema o con una unidad o s,mbolo parecido, como los
de un alfabeto o silabario de la forma escrita de un lenguaje natural.
o Cadena: una cadena de caracteres, palabra, ristra de caracteres o frase
)string en ingls* es una secuencia ordenada de longitud arbitraria )aunque finita* de
elementos que pertenecen a un cierto alfabeto. !n general, una cadena de
caracteres es una sucesin de caracteres )letras, n5meros u otros signos o
s,mbolos*.
Booleanos: La lgica binaria trabaja con variables binarias y operaciones
lgicas. %s,, las variables slo tomarn dos valores discretos: 9 )verdadero* y :
)falso*. aunque tambin se pueden denotar como s, y no, 2 y 0 respectivamente.
Definidos por el !suario
Tipos enumerados: Los tipos enumerados se componen de una lista de
identificadores encerrados entre parntesis y separados por comas.
!jemplo:
;ype
!staciones < )primavera, verano, oto-o, invierno*.
"olores )rojo, amarillo, verde, azul, violeta*.
Los tipos enumerados son ordinales ya que llevan asociado cada uno un n5mero
entero, empezando por el primero, al que se le asigna el (, al segundo un 2, y as,
sucesivamente, por lo que no es independiente el orden de declaracin. Un valor de
tipo enumerado no puede pertenecer a dos declaraciones de tipo distintas y no
pueden leerse desde teclado, ni escribirse en pantalla.
Tipos su"#ran$o: !s un subconjunto de un tipo ordinal )enteros, boolean, carcter
y enumerado* que se especifica indicando el primero y el 5ltimo elemento del
conjunto.
!jemplo 2:
;ype
$dentificador<primer elemento...ultimo elemento.
!jemplo 4:
;ype
:ec6a< 2...32.
9ar
+,a: :ec6a.
Los tipos enteros, carcter, booleanos, enumerados y sub1rango se denominan
tipos ordinales. Un tipo ordinal representa una secuencia ordenada de valores
individuales, a los que se puede aplicar los conceptos de predecesor y sucesor. !n
cada tipo de datos ordinales 6ay un primer valor y un 5ltimo valor.
Datos A"stractos
!s un modelo matemtico compuesto por una coleccin de operaciones definidas
sobre un conjunto de datos para el modelo.
La abstraccin de datos consiste en ocultar las caracter,sticas de un objeto y
obviarlas, de manera que solamente utilizamos el nombre del objeto en nuestro
programa.
% esto se le llama =%bstraccin> y es un concepto muy 5til en la programacin, ya
que un usuario no necesita mencionar todas las caracter,sticas y funciones de un
objeto cada vez que ste se utiliza, sino que son declaradas por separado en el
programa y simplemente se utiliza el trmino abstracto para mencionarlo.
Direcci%n de &emoria
!s un identificador para una localizacin de memoria con la cual un programa de
ordenador o un dispositivo 6ard?are pueden almacenar un dato para su posterior
reutilizacin.
Una forma com5n de describir la memoria principal de un ordenador es como una
coleccin de celdas que almacenan datos e instrucciones. "ada celda est
identificada un,vocamente por un n5mero o direccin de memoria.
@ara poder acceder a una ubicacin espec,fica de la memoria, el "@U genera
se-ales en el bus de direccin, que 6abitualmente tiene un tama-o de 34 bits en la
mayor,a de mquinas actuales. Un bus de direccin de 34 bits permite especificar a
la "@U 4
34
< A.4BA.BCD.4BC direcciones de memoria distintas.
+ebido a la estructura de 34 &its de un procesador com5n como los de $ntel, las
direcciones de memoria se e8presan a menudo en 6e8adecimal.
@or ejemplo, para no tener que escribir 222222020200000000000020202200
podemos escribir 3:E000%" en 6e8adecimal.
'unteros o Apuntadores
!s una variable que referencia una regin de memoria. en otras palabras es una
variable cuyo valor es una direccin de memoria. i se tiene una variable F p F de tipo
puntero que contiene una direccin de memoria en la que se encuentra almacenado
un valor F v F se dice que F p F apunta a F v F.
;rabajar con punteros implica la no manipulacin de las variables en s,, sino
manejar direcciones de memoria en la cuales residen los datos.
Declaraci%n de punteros
La declaracin de punteros utiliza un asterisco )G*, que en este caso act5a como
calificador de tipo, en una sinta8is muy parecida a la utilizada en la declaracin de
objetos normales.
'eli$ro en la declaraci%n de punteros
%unque las declaraciones m5ltiples )en la misma sentencia* son aceptables en "HH,
con los punteros deben evitarse, porque es ms que probable que el compilador
intrprete errneamente las declaraciones sucesivas.
!jemplo:
int G ptr2 ,ptr4. II @osible errorJJ
!n estos casos es mejor 6acer:
int G ptr2.
int G ptr4.
(niciali)aci%n de 'unteros
Un puntero, como cualquier variable u objeto, adems de ser declarado )para
comenzar a e8istir* necesita ser inicializado )darle un valor de modo controlado*, lo
cual se realiza mediante el operador de asignacin )F<F*. +esde que el puntero es
declarado almacena un valor, el problema es que se trata de un valor aleatorio,
intentar operar con un puntero sin 6aberlo inicializado es una frecuente causa de
problemas.
Opciones de iniciali)aci%n
Un puntero puede ser inicializado con la direccin de memoria de un objeto, tal
objeto debe pertenecer a un tipo acorde al tipo al que apunta el puntero. @uede
tratarse de la direccin de un elemento de un array o de una variable individual, el
operador *+* antepuesto a un objeto nos devuelve su direccin de memoria. ;ambin
puede utilizarse un KliteralK, ya sea numrico, de carcter, o de otro tipo, y puede
inicializarse como puntero nulo, en este caso est permitido usar el 0, el 5nico
entero permitido, por su equivalencia con el valor N!,,.
uponiendo un tipo cualquiera K;K, son inicializaciones validas las siguientes:
'untero iniciali)ado a
partir de:
Declaraci%n e iniciali)aci%n
en una misma l-nea
Declaraci%n e iniciali)aci%n
desdo"ladas
!n o"jeto indi.idual
; 8.
;G ptr < L8.
;G ptr.
ptr < L8.
!n array de o"jetos
; 8 M20N.
;G ptr < L8M0N.
;G ptr.
ptr < L8M0N.
;G ptr < 8.
;G ptr.
ptr < 8.
Otro puntero del
mismo tipo
;G 8.
;G ptr < 8.
;G ptr.
ptr < 8.
/alor 0 1 puntero nulo
#ull<0
;G ptr < 0.
;G ptr.
ptr < 0.
;G ptr < #ULL.
;G ptr.
ptr < #ULL.
!n literal ;G ptr < MliteralN
;G ptr.
ptr < MliteralN.
obre este cuadro caben las siguientes aclaraciones:
2# $nicializar un puntero apuntando al primer elemento de un array admite dos
notaciones equivalentes, en la segunda se sobreentiende que el elemento apuntado
es el primer elemento del array.
3# La equivalencia entre el valor 0 )cero* y #ULL es de uso general, sin embargo
e8isten compiladores que dan a #ULL un valor diferente a cero.
4# Un FliteralF debe ser el apropiado para el tipo de puntero inicializado. i es un
puntero a c6ar, una cadena de caracteres cualquiera )ej.: K6olaK* ser un literal
adecuado, si se trata de tipo numrico, para un int KAK ser apropiado.
i tomamos como ejemplo el tipo Kc6arK, siguiendo al cuadro anterior, tenemos las
siguientes opciones de inicializacin:
'untero iniciali)ado aDeclaraci%n e iniciali)aci%nDeclaraci%n e
partir
de:
en
una misma l-nea
iniciali)aci%n
desdo"ladas
!n elemento
c6ar c6.
c6arG p < Lc6.
c6arG p.
p < Lc6.
!n array
c6ar cadM20N.
c6arG p < cad.
c6arG p.
p < cad.
c6arG p < LcadM0N.
c6arG p.
p < LcadM0N.
/alor 0 1 puntero nulo
#ull<0
)0 es el 5nico valor
entero que puede
inicializar un puntero*
c6arG p < 0.
c6arG p.
p < 0.
c6arG p < #ULL.
c6arG p.
p < #ULL.
Otro puntero 5ya
iniciali)ado6
c6ar Gptr.
c6arG p < ptr.
c6arG p.
p < ptr.
!n literal de cadena
KcasaK.
c6arG p < KcasaK.
c6arG p.
p < KcasaK.
e 6a insistido lo suficiente en que un puntero almacena como .alor una
direcci%n de memoria, por eso la presencia de un FliteralF, en esta 5ltima tabla el
literal de cadena KcasaK, puede sorprender. !s importante tener claro que todos los
literales se almacenan desde el comienzo del programa en un lugar del segmento
de datos, no es posible obtener su direccin )por medios normales* pero e8iste, es
al comienzo de dic6o segmento, el mismo sitio que se reserva a valores constantes
y variables globales.
Un literal es tratado como constante, esto es lo que permite que una funcin pueda
retornar una constante sin temor a que dic6o almacenamiento se pierda al salir de la
funcin, un literal no es una variable FlocalF. #o 6ay obstculos para inicializar un
puntero con una variable constante, por lo tanto lo mismo se aplica a literales de
cualquier tipo.
Las tablas anteriores no abarcan todos los casos posibles de inicializacin de
punteros, aun no se 6an mencionado los casos donde el puntero apunta a una
funcin o un objeto miembro de una clase, ni la opcin de inicializar a travs de
memoria dinmica.
(niciali)aci%n a tra.s de memoria dinmica
!sta modalidad se diferencia de todas las enumeradas 6asta a6ora y puede
considerarse como la principal. ;odas las formas vistas 6asta aqu, asignan al
puntero la direccin de memoria de otra entidad )elemento, array, puntero, literal*
adems del caso especial del valor #ULL. Oa se 6a mencionado que la declaracin
de un puntero no implica la reserva de memoria, salvo 4 bytes para almacenar una
direccin, por esa razn podr,a decirse que el puntero, cuando es inicializado por
otro elemento, FviveF de la memoria que le aporta el objeto al que apunta.
La reserva de memoria dinmica requiere el uso obligado de un puntero, el cual
apuntara al comienzo de la zona reservada. Lo diferente aqu, es que se trata del
5nico caso donde el puntero no necesita de otro elemento que le aporte memoria
necesaria, no necesita apuntar a alg5n otro objeto. "uando reservamos
dinmicamente A0 bytes para un puntero a car, operaremos con el puntero Fcomo siF
apuntara a un segundo objeto )un array de caracteres*, pero tal array no e8iste.
% pesar de no e8istir propiamente un segundo objeto, sigue siendo esencial, el tipo
)type* seg5n el cual se declara el puntero, pues esto determina el modo en que el
puntero nos permitir acceder a tal zona de memoria. #o 6ay un Fobjeto apuntadoF,
pero el puntero se conduce igual que si lo 6ubiera, por esa razn 6ablaremos en
general del Fobjeto apuntadoF por el puntero, sin aclarar el caso especial que
estamos considerando.
!n "HH la reserva y liberacin de memoria dinmica se realiza a travs de los
operadores ne7 y delete, y su sintaxis, para un puntero de nombre 'ptr' es la
siguiente:
Reser.a ,i"eraci%n
Elemento indi.idual
de tipo *T*
;G ptr < ne? ;. delete ptr.
Array de *n* elementos
de tipo *T*
;G ptr < ne? ;MnN. delete MN ptr.
% travs del operador ne7 solicitamos una cierta cantidad de memoria dinmica, es
posible que no e8ista suficiente memoria disponible, en tal caso el operador nos
devolver un puntero #ULL )o apuntando a 0*, y es por esta razn que luego de una
solicitud es recomendable inspeccionar si el puntero devuelto es nulo. !sta ser,a la
respuesta FclsicaF a una reserva fallida de memoria dinmica, sin embargo e8isten
diferentes compiladores que, ajustndose al standard "HH no devuelven un puntero
nulo sino que lanzan una e8cepcin )badPalloc*.
'unteros a *.oid*
Un puntero puede apuntar a un objeto de cualquier tipo, predefinido por el lenguaje
o definido por el usuario. F9oidF es el nombre de un tipo, pero su uso est sujeto a
mayores restricciones respecto a otros tipos.
!l significado en "HH de un puntero a *.oid* es el de un puntero que apunta a una
)ona de memoria no iniciali)ada, memoria Fen brutoF, o en la cual se encuentra
almacenado un objeto de tipo desconocido, en general se trata de cdigo que
trabaja a nivel 6ard?are o relacionado con administracin de memoria.
Las operaciones permitidas y no permitidas, en "HH, para un puntero a void se
resumen en el siguiente cuadro:
Operaciones
permitidas
21 %signar a voidG un puntero de cualquier tipo voidG<;G
41 %signar un void a otro void voidG < voidG
31 "onvertir e8pl-citamente un void a otro tipo ;G < );G*voidG
A1"omparaciones de igualdad o desigualdad entre
voidG
)voidGJ<voidG*
Operaciones
pro9i"idas
21Usar un void )voidG*HH.
41"onvertir impl,citamente un void a otro tipo )no void* ;G < voidG
31+esreferenciar un void. Gv.
A1%signar a void punteros a funciones o a miembros
'untero nulo 5:Null pointer:6
%lgunos autores definen a este puntero como Kaquel que no apunta a ningn sitioK y
otros como Kun puntero que no apunta a ningn objetoK )tourtrup12BBD*. La
segunda definicin es ms clara, mientras que la primera puede introducir alguna
confusin. +e 6ec6o no est claro que podr,a significar que Fno apuntar a ning5n
sitioF.
!l concepto de Fpuntero nuloF e8iste por la necesidad practica de 6ablar de un
puntero que no est ligado a ning5n objeto, muc6,simas funciones de las librer,as de
cIcHH devuelven punteros y entre los posibles valores de retorno cuentan con el de
puntero nulo )ej.: strc6r )* *, tambin se presenta cuando solicitamos memoria
dinmica, el operador Fne?F retorna un puntero nulo si no 6ay memoria suficiente )no
todos los compiladores*.
La localidad de memoria donde est el puntero contiene siempre alg5n valor )Jno
e8isten celdas vac,asJ cero es un valorJ*. Un puntero apunta a una direccin, la
indicada por el valor que almacena, por lo tanto es lgico concluir que un puntero
siempre apunta a alg5n sitio.
Lo que distingue a un puntero nulo no es que Fno apunte a ning5n sitioF sino que
apunta a al$una localidad de memoria que; por con.enci%n del compilador
utili)ado; no puede estar asociada a nin$n o"jeto o .aria"le. !se valor, esa
direccin Fpro6ibidaF para almacenar all, alg5n objeto, varia para diferentes
compiladores, para &orland )y la mayor,a* es la direccin 0 )cero* del segmento de
datos. "uando el puntero apunta a la localidad 0 el compilador considera que su
valor es FnullF, o lo que es lo mismo, para este compilador FnullF es equivalente a
cero. !sa direccin e8iste y es el comienzo del segmento de datos1stacQ, puede ser
visualizado, y si no 6ay errores su valor deber,a ser 0.
!8iste otro concepto que no debe confundirse con el de puntero nulo, el de K?ild
pointerK. Un puntero nulo apunta a un sitio bien determinado, en cambio un F?ild
pointerF puede estar apuntando a cualquier sitio, una direccin indeterminada dentro
del segmento.
Aritmtica de punteros
on posibles ciertas operaciones con punteros y los operadores de suma y resta )1,
H,11,HH*. iendo F;F el tipo a que apunta el puntero, el siguiente cuadro sintetiza las
distintas posibilidades y el tipo de resultado generado:
Operaci%n Resultado Comentarios
'untero <#
entero
'untero a T ms
entero
@untero a ;
i el puntero apunta mas all del
l,mite superior del
array el resultado es no definido
'untero a T menos
entero
@untero a ;
i el puntero apunta mas all del
l,mite inferior
del array el resultado es no
definido
'untero <#
puntero
@untero mas puntero 1111111111111 #o permitido
'untero a T menos
puntero a T
!ntero
!l resultado indica el n5mero de
elementos ; entre
los dos punteros
Los punteros son direcciones de memoria pero la aritmtica de punteros no es una
simple suma o resta de direcciones. !stas operaciones estn adaptadas
especialmente para tratar con arrays, de a6, que incrementar en 2 el valor de un
puntero no apunte a la pr8ima direccin de memoria, sino al pr8imo elemento de
un array. !l 5nico caso donde Fpr8ima direccinF es igual a Fpr8imo elementoF es el
caso de un array de caracteres, los restantes tipos )por lo menos los propios del
lenguaje* ocupan ms de un byte por elemento.

Potrebbero piacerti anche