Está en la página 1de 24

INSTITUTO TECNOLÓGICO DE QUERÉTARO

ESTRUCTURA DE DATOS

¿Que es una abstracción?

Un proceso mental, mediante el cual se


extraen los rasgos esenciales de algo
para representarlos por medio de un
lenguaje gráfico o escrito.

Puesto que es un proceso mental la


acción es una acción subjetiva y creativa,
esto es depende del contexto psicológico
de la persona que lo realiza.
TIPO DE DATOS ABSTRACTO

La Abstracción de Datos es la
técnica de inventar nuevos tipos de
datos que sean más adecuados a
una aplicación y, por consiguiente,
facilitar la escritura del programa. La
técnica de abstracción de datos es
una técnica potente de propósito
general que cuando se utiliza
adecuadamente, puede producir
programas más cortos, más legibles
y flexibles.
TIPO DE DATOS ABSTRACTO

Los lenguajes de programación soportan en


sus compiladores tipos de datos
fundamentales o básicos (predefinidos), tales
como int, char y float en C, C++ y Java.

Lenguajes de programación, como C++, tienen


características que permiten ampliar el
lenguaje añadiendo sus propios tipos de
datos.
Un tipo de dato definido por el programador se denomina tipo abstracto
de dato, TAD (Abstract Data Type, ADT). El término abstracto se
refiere al medio en que un programador abstrae algunos conceptos de
programación creando un nuevo tipo de dato.

Los paradigmas más populares soportados por el lenguaje C++ son:


programación estructurada y programación orientada a objetos.
TIPO DE DATOS ABSTRACTO

Tipos de Datos Nativos en C++


Ventajas de los tipos abstractos de datos

• Los tipos abstractos de datos proporcionan numerosos


beneficios al programador, que se pueden resumir en los
siguientes:
• Permite una mejor conceptualización y modelización (modelado)
del mundo real. Mejora la representación y la comprensibilidad.
Clasifica los objetos basados en estructuras y comportamientos
comunes.
• Mejora la robustez del sistema. Permiten la especificación del
tipo de cada variable, de tal forma que se facilita la
comprobación de tipos para evitar errores de tipo en tiempo de
ejecución
• Mejora el rendimiento (prestaciones). Para sistemas tipificados,
el conocimiento de los objetos permite la optimización de tiempo
de compilación.
Ventajas de los tipos abstractos de datos

• Separa la implementación de la especificación. Permite la


modificación y mejora de la implementación sin afectar al
interfaz público del tipo abstracto de dato.
• Permite la extensibilidad del sistema. Los componentes de
software reutilizables son más fáciles de crear y mantener.
• Recoge mejor la semántica del tipo. Los tipos abstractos de
datos agrupan o localizan las operaciones y la representación
de atributos
MODULARIDAD
La Modulariad descompone un programa en un pequeño número de abstracciones
independientes unas de otras pero fáciles de conectarse entre si.
Un módulo se caracteriza principalmente por su interfaz y su implementación.
ESTRUCTURA DE DATOS
Cualquier colección o grupo de datos organizados de tal forma que
tengan asociados un conjunto de operaciones para poder
manipularlos, se dice que conforma una estructura de datos.

• Arreglos
Estáticas
• Matrices
• Listas
Internas
• Lineales • Pilas
Dinámicas • Colas
Estructuras
de Datos
• Árboles
• No Lineales
• Grafos

• Bases de Datos
Externas
• Archivos
MANEJO DE MEMORIA
Para implementar alguna estructura de datos, primero es
necesario tener muy claro cómo va a ser el manejo de
memoria

Estática Dinámica
Durante la ejecución del Durante la ejecución del
programa el tamaño de programa el tamaño de la
la estructura no cambia estructura puede cambiar
MEMORIA ESTÁTICA
ARREGLOS

Definición: Colección finita, homogenea y ordenada de elementos.


Finita: Porque todo arreglo tiene un límite. Homogenea: Porque
todos los elementos son del mismo tipo. Ordenada: Porque se
puede determinar cuál es el enésimo elemento.
nUn arreglo tiene dos partes: Componentes e índices

C1 C2 .... Cn Componentes
i0 i1 in Índices
n Componentes: Hacen referencia a los elementos que forman el
arreglo.
n Índices: Permiten referirse a los componentes del arreglo en
forma individual.
MEMORIA ESTÁTICA
ARREGLOS UNIDIMENSIONALES

Son los arreglos más simples y constan de un solo índice,


también se llaman vectores.
Notación: Podría ser de diferentes maneras.
Por ejemplo:
Array [0...9] de enteros: Vector
Vector: X

14 43 .... 4 Componentes
x0 x1 x9 Índices
n X hace referencia a todo el vector, mientras que x0, o x1
hace referencia los elementos en forma individual
MEMORIA ESTÁTICA
ARREGLOS UNIDIMENSIONALES

Los arreglos se almacenan en forma adyacente, así que su


representación en memoria es:
X0 ,Dirección z; X1 ,Dirección z+1; Xn ,Dirección z+n
n Cada elemento del arreglo se puede procesar como si fuera una
variable simple.
Ejemplo:
Suma Suma + x[2]
X[2] 15
i 3
X[i] 15
X[i+2] 15
n Sobre los vectores se pueden realizar las siguientes
operaciones: Lectura/Escritura, Asignación, Actualización
(insertar, eliminar, Modificar), Ordenamiento y Búsqueda.
MEMORIA ESTÁTICA
ARREGLOS BIDIMENSIONALES

Estos arreglos constan de dos índices, también se llaman matrices.


Notación: Podría ser de diferentes maneras.
Por ejemplo:
Array [0...2, 0...2] de enteros: Matriz
Matriz: M

0 1 2 Indices
34 43 90 0 n Operaciones: Lectura,
83 2 41 1 Escritura, Asignación.
56 75 3 2
Componentes
MEMORIA ESTÁTICA
ARREGLOS Y REGISTROS

I. Registro Anidado: Por lo menos un campo del registro


es de tipo registro.

Tipo registro: Domicilio


Cadena: Calle
Cliente
Entero: Numero
Cadena: Ciudad Dirección
Fin Tipo Nombre Saldo
Cll Num Ciu
Tipo registro: Cliente
Cadena: Nombre
Domicilio: Dirección
Notación:
Real: Saldo
Cliente.Nombre
Fin Tipo
Cliente.Dirección.Calle
MEMORIA ESTÁTICA
ARREGLOS Y REGISTROS

I. Registro con Arreglos: Por lo menos un campo del registro


es un array.

Array [0...2] de Real:Vector


Tipo registro: Estudiante
Cadena: Nombre
Cadena: Código
Vector: Notas Estudiante
Fin Tipo
Notas
Nombre Código

Notación:
Estudiante.Nombre
Estudiante. Notas[0]
MEMORIA ESTÁTICA
IMPLEMENTACIÓN DE VECTORES Y
MATRICES EN C++
Los índices en C++ van de la posición 0 hasta la posición tamaño - 1

int arregloEntero[10];
//Declaracion de un arreglo de 10 elementos, sin inicializar.

arregloEntero[5] = 45; //Asignacion de 45 al elemento 6 del arreglo.

double arrPuntoFlotante[3] = {1.1,1.2,1.3};


//Declaracion y asignacion en un arreglo de 3 elementos double.

int a[4], b[5];


//Declaracion de dos arreglos enteros, de 4 y 5 elementos.

Char m[2][3]; // Declaración de una matriz de 2 renglones y 3 columnas


de tipo char

En C++ no se puede asignar un arreglo completo a otro arreglo, es decir esto no


se puede hacer:
Char A[10], B[10];
.
B = A; // No se puede asignar
MEMORIA ESTÁTICA
IMPLEMENTACIÓN DE REGISTROS EN C++
VENDEDORES
NOMBRE APELLIDOS DIRECCION CLAVE_
VENDEDOR VARIOS PRODUCTOS
NUM_ PRECIO_TO
PRODUCTOS PRODUCTO TAL

NOMBRE CANTIDAD PRECIO SUBTOTAL

struct unProducto {
char name_prod[MAXCAD]; // nombre del producto
int cantidad;
int precio ;
int subtotal;
};

struct variosProductos {
int numProductos ; // numero de productos por vendedor
unProducto vp[MAX_PV]; //varios productos cada uno en una posición del vector
int precioTotal ;
};

struct Vendedor {
char nombre[MAXCAD] ;
char apellidos[MAXCAD] ;
char direccion[MAXCAD];
int clave_vendedor ;
variosProductos P ;
};

struct Vendedor Lista_Vendedores[MAX_V]; // Se crea un arreglo de vendedores


MEMORIA DINÁMICA
APUNTADORES
Es también llamada almacenamiento libre y en estos casos el programador solicita (new)
memoria para almacenar un objeto y es responsable de liberarla (delete) para que pueda ser
reutilizada por otros objetos.

Es aquella que se reserva en tiempo de ejecución después de leer los datos y de conocer
el tamaño exacto del problema a resolver. El sitio donde se almacenan los objetos se le
denomina HEAP = MONTÍCULO pero el sitio preciso donde se encuentra tal montículo
depende del compilador y el tipo de puntero utilizado en la reserva de memoria dinámica.

Puntero (apuntador): un puntero o apuntador es Int cont;


un tipo especial de variable que almacena el valor Int * apunta;
de una dirección de memoria la cual puede ser de …
una variable individual, de un elemento de un cont = 2;
arreglo, una estructura u objeto de una clase y se …
anota de la siguiente manera: apunta = &cont;

Tipo de apuntador + nombre de la variable. apunta


cont
29DC
Int * Pint; =è Apuntador a un entero. 2
Char * Pchar; =è Apuntador de carácter.
La variable “apunta” contiene
la dirección de memoria
de la variable “cont”
MEMORIA DINÁMICA
APUNTADORES
Cuando el sistema operativo carga un programa para ejecutarlo y lo convierte en proceso, le
asigna cuatro partes lógicas en memoria principal:

Texto, Datos (estáticos), Pila y una Zona


Libre. Esta zona libre (o Heap) es la que va
a contener los datos dinámicos, la cual, a su
vez, en cada instante de la ejecución tendrá
partes asignadas a los mismos y partes
libres que fragmentarán esta zona, siendo
posible que se agote si no se liberan las
partes utilizadas ya inservibles. (La pila
también varía su tamaño dinámicamente,
pero la gestiona el sistema operativo, no el
programador):

Físicamente, un apuntador no es más que


una dirección de memoria. En el ejemplo
de la imágen derecha se muestra el
contenido de la memoria con un apuntador
que apunta a la dirección 78AC16, la cual
contiene 667716:
MEMORIA DINÁMICA
APUNTADORES

La referenciación es la Ejemplo:
obtención de la dirección
de una variable. En C++ int i = 5;
esto se hace a través del int *p, *q;
operador ‘&’, aplicado a la p = &i; // Se le asigna a ’p’ la dirección de ’i’
variable a la cual se q = p; // Se le asigna a ’q’ la dirección
almacenada en ’p’ (la misma de ’i’)
desea saber su dirección.

La desreferenciación es
la obtención del valor Ejemplo:
almacenado en el espacio
int x = 17, y;
de memoria donde apunta
int *p;
un apuntador. En C++ esto p = &x; cout << "El valor de x es: " << *p <<
se hace a través del endl; // Imprime 17
operador ‘*’, aplicado al
apuntador que contiene la y=*p+3; // a ’y’ se le suma 3 más para valer 20
dirección del valor.
MEMORIA DINÁMICA
APUNTADORES

C++ además provee el operador binario ‘->’, utilizado para obtener campos de un
registro con un apuntador al mismo de una manera m a ́ s fácil y legible.

struct Datos {
char nombre[20];
int edad;
};

Datos d;
Datos *pd = &d;

(*pd).edad = 23; // Acceso al campo ’edad’ utilizando el operador ’.’

pd->edad = 23; // Acceso al campo ’edad’ utilizando el operador ’->’


MEMORIA DINÁMICA
APUNTADORES
Operadores New y Delete de C++

int * empleado;
Operadores new y new[ ] empleado = new int [5];
Para solicitar memoria dinámica es: If (empleado == NULL) {
pointer = new type // error en la asignación...
o };
pointer = new type [elementos]

Operador delete y delete []


Una vez que no se necesita más debería ser
liberada para que se convierta en disponible para
futuras solicitudes de memoria dinámica. Para este empleado
propósito existe el operador delete, cuya forma es:
delete pointer;
o
delete [] pointer;

Nota: los operadores new y delete son propios de C++. En C se usan funciones, como
malloc y free para reservar y liberar memoria dinámica.
MEMORIA DINÁMICA
APUNTADORES
Ejemplo: Operadores New y Delete de C++
int main() {
char *c;
int *i = NULL;
float **f;
int n;

// Cadena de 122 más el nulo:


c = new char[123];
// Arreglo de 10 apuntadores a float:
f = new float *[10];
// Cada elemento del arreglo es un arreglo de 10 float
for(n = 0; n < 10; n++)
f[n] = new float[10];
// f es un arreglo bidimensional de 10*10
f[0][0] = 10.32;
f[9][9] = 21.39;
c[0] = 'a';
C[1] = 0;
// liberar memoria dinámica
for(n = 0; n < 10; n++)
delete[] f[n];
delete[] f;
delete[] c;
delete i;
return 0;
}

También podría gustarte