CONCEPTUALIZACIÓN DE
ESTRUCTURA DE DATOS
CONCEPTUALIZACIÓN DE ESTRUCTURA
DE DATOS
Una estructura de datos es la colección de datos que se caracterizan por su
organización y las operaciones que se definen en ella. Los datos de tipo
estándar pueden ser organizados en diferentes estructuras de datos:
estáticas y dinámicas.
CONCEPTUALIZACIÓN DE ESTRUCTURA
DE DATOS
Podemos enumerar como estructuras estáticas :
Los arreglos: Unidimensionales
Bidimensionales
Los Struct
Y en las estructuras dinámicas::
Listas
Pilas
Colas
Arboles
Grafos.
CONCEPTUALIZACIÓN DE ESTRUCTURA
DE DATOS
Las estructuras estáticas son aquellos en las que el espacio ocupado en memoria
se define en tiempo de compilación y no puede ser modificado durante la
ejecución del programa; por el contrario, en las estructuras de datos dinámicas el
espacio ocupado en memoria puede ser modificado en tiempo de ejecución.
La unidad de dato en la programación es la Variable
Nombre
A Dirección de Memoria
Valor
CONCEPTUALIZACIÓN DE ESTRUCTURA
DE DATOS
La elección de la estructura de datos idónea dependerá de la naturaleza
del problema a resolver y en menor medida, del lenguaje. Las estructuras
de datos tienen en común que un identificador, nombre, puede representar
a múltiples datos individuales.
Las estructuras estáticas denominadas arreglos, las podemos definir como
la colección de datos del mismo tipo, que se almacenan en posiciones
consecutivas de memoria y reciben un nombre común. Para referirse a un
determinado elemento de un arreglo se deberá utilizar un índice, que
especifique la posición relativa en el arreglo. Los arreglos pueden ser:
PUNTEROS
Estructura de datos
QUE ES UN PUNTERO
Un puntero es una variable capaz de almacenar direcciones de
memoria y mediante los operadores adecuados acceder a la
información que contiene la dirección de memoria a la que “apunta”
en cada momento
ASÍ SE DECLARAN
PUNTEROS:
necesita saber el tipo apuntado (dato) para poder manipularlo.
<tipo> * <Identificador>
<Tipo> tipo de dato del objeto referenciado por el puntero
<Identificador> Identificador de la variable de tipo puntero
int *p; // puntero a entero
char *c; // puntero a carácter
OPERADORES * Y &
& devuelve la dirección de memoria donde comienza la variable .
* devuelve el contenido del objeto referenciado por el puntero . El operador *
se usa para acceder a los objetos a los que apunta un puntero
¿POR QUÉ SON IMPORTANTES LOS PUNTEROS?.
Los punteros a datos mejoran significativamente el rendimiento de las
operaciones repetitivas tales como cadenas de desplazamiento, tablas de
búsqueda, tablas de control y estructuras árbol.
Cuando se declara un puntero se reserva memoria para albergar una
dirección de memoria, pero NO PARA ALMACENAR EL DATO AL QUE APUNTA
EL PUNTERO. El espacio de memoria reservado para almacenar un puntero
es el mismo independientemente del tipo de dato al que apunte: el espacio
que ocupa una dirección de memoria.
¿CUÁLES SON LOS PELIGROS / ERRORES
TÍPICOS CON PUNTEROS?.
Olvidarnos de reservar memoria, Olvidarnos de devolver memoria.
Apuntar a dónde no es, No utilizar el operador adecuado (*, &).
EJEMPLOS:
#include <iostream> p_num = #
#include <stdio.h> cout<<"el número es: "<<*p_num<<endl;
cout<<"la dirección de memoria es:
#include <conio.h>
"<<p_num;
using namespace std; getch();
return 0;
}
int main()
{
int num;
int *p_num;
cout<<"ingrese un numero";
cin>>num;
EJEMPLOS:
#include <stdio.h>
#include <stdlib.h>
int main(){
int valor =5 ;
int *p;
int **pp;
p=&valor;
pp=&p;
printf("Contenido en memoria: %8d Direccion de memoria: %p Tipo de dato: int\n",
valor, &valor );
printf("Contenido en memoria: %p Direccion de memoria: %p Tipo de dato: int*\
n",p,&p);
printf("Contenido en memoria: %p Direccion de memoria: %p Tipo de dato: int**\
n",pp,&pp);
printf("\n\nEl valor al que apunta mi puntero a entero es: %d",*p);
}
EJEMPLOS:
#include <iostream> for (i = 0; i < 4; i++)
#include <stdio.h> {
printf("%d ", *p++ );
#include <conio.h>
using namespace std; }
getch();
return 0;
int main()
}
{
int t[] = {1, 2, 3, 5};
int *p;
int i;
p = &t[0];
//p=t;
EJEMPLOS:
#include "iostream"
#include "stdio.h" int main()
{
using namespace std; int numero = 10;
cout << "Antes de funcion " << numero << "\n";
int funcion(int valor)
funcion(numero); //Se pasa por valor
{
valor = valor + 10;
cout << "Despues de funcion " << numero << "\n";
return valor; cout << "Antes de funcionPunteros " << numero <<
} funcionPunteros(&numero);
cout << "Despues de funcionPunteros " << numero <
int funcionPunteros(int* valor) system("pause");
{ return 0;
*valor = *valor + 10; }
return *valor;
}
EJERCICIO
Realice un ejercicio en Dev que permita conocer si un numero es par o
impar además imprima las direcciones de memoria.
Realice un ejercicio en Dev C++, que permita ingresar n elementos al
vector y averiguar cuantos son primos (utilizar punteros)
PUNTERO A void ingresar()
{
cout<<"Ingrese datos de la estructura";
ESTRUCTURAS for (int i=0;i<3;i++)
{
cout<<"\ningresa el codigo: ";
#include<iostream>
cin>>((p_a+i)->codigo);
#include<conio.h> getchar();
#include <stdio.h> cout<<"\ningresa el nombre: ";
using namespace std; [Link]((p_a+i)->nombre,30,'\n');
struct alumno{ cout<<"\ningresa el apellido: ";
int codigo; [Link]((p_a+i)->apellido,30,'\n');
char nombre[25]; cout<<"\n\n";
char apellido[25]; }
}
}a[3];
void imprimir(alumno *)
alumno *p_a = a; {
void ingresar(); system("cls");
void imprimir(alumno *); cout<<"Datos Ingresados";
int main() for (int i=0;i<3;i++)
{ {
ingresar(); cout<<"\nel codigo: "<<(p_a+i)->codigo;
imprimir(p_a); cout<<"\ningresa el nombre: "<<(p_a+i)-
>nombre;
getch(); cout<<"\ningresa el apellido: "<<(p_a+i)-
return 0; >apellido;
} cout<<"\n\n";