Estructuras lineales

3.763 visualizaciones

Publicado el

Estructuras lineales | Lenguaje C++ | Profesor Mauricio Paletta

0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
3.763
En SlideShare
0
De insertados
0
Número de insertados
2
Acciones
Compartido
0
Descargas
38
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

Estructuras lineales

  1. 1. Presentación Estructuras de Datos Lineales Mauricio Paletta INGENIERÍA EN INFORMÁTICA Programación II Coordinación General de PregradoUNIVERSIDAD NACIONAL EXPERIMENTAL DE GUAYANA Programación II
  2. 2. IntroducciónLa memoria se puede ver como una granmatriz de celdas, cada una de las cualesrepresenta un byte de información y tieneasociado un único número o dirección a lacual se le puede llegar directamente.Una interesante analogía de este concepto loes un conjunto de casilleros postalesagrupados matricialmente. El contenido delcasillero es el byte de información. El número(llave) es la dirección. Programación II
  3. 3. Introducción Programación II
  4. 4. IntroducciónCada vez que se declara algo (variable,constante, función, estructura, etc.) estadeclaración debe tener asociado un conjuntode celdas de la matriz de memoria de tantosbytes como requiera la declaración.Para cualquier declaración es importantesaber cómo se accede o se obtiene: 1) La data (contenido del buzón). 2) La dirección (llave o número del buzón). Programación II
  5. 5. IntroducciónSegún el momento en el cual se solicita lamemoria, esta solicitud puede ser: 1) Estática (tiempo de compilación). 2) Dinámica (tiempo de ejecución).La asignación de memoria se puede hacer dedos maneras: 1) Continua o lineal. 2) No continua o no lineal. Programación II
  6. 6. Solicitudes estáticasOcurre en tiempo de compilación delprograma. El compilador sabe exactamentela cantidad de bytes que se requieren parasatisfacer la declaración y se procede a hacerla reserva del espacio.Ejemplo: int I; double D; Programación II
  7. 7. Solicitudes estáticasEn cualquier declaración de tipo básico (int,double, char, bool, etc.) el identificador de ladeclaración representa el contenido o dato(buzón). Para obtener la dirección (llave /número del buzón) se hace uso del operadorunario &.Ejemplo: double D; D es la data &D es la dirección Programación II
  8. 8. Solicitudes estáticas Cantidad de bytes necesarios para representar/almacenar un dato de tipo double sizeof(double) … … &D Ddirección data Programación II
  9. 9. Solicitudes dinámicasOcurre en tiempo de ejecución del programa.Se hace uso del operador de reserva dememoria new. Este operador retorna unadirección de memoria o apuntador, por lo quese requiere declarar un apuntador para recibirlo que el operador new retorna.Para declarar apuntadores de memoria sehace uso del símbolo *. Programación II
  10. 10. Solicitudes dinámicasEjemplo: int *pI; double *pD;En cualquier declaración de tipo básico, si setiene una dirección de memoria (apuntador),el operador * permite obtener la dataalmacenada en el espacio de memoria a lacual el apuntador apunta. Programación II
  11. 11. Solicitudes dinámicasEjemplo: double *pD = new double(); Uso del operador new para reserva dinámica de memoria … … pD *pD dirección data Programación II
  12. 12. Solicitudes dinámicasEjemplo: double D, *pD = &D; Los apuntadores no sólo son utilizados para hacer reserva dinámica de memoria … … &D = pD D = *pD dirección data Programación II
  13. 13. Solicitudes dinámicasEn C++ el programador es responsable decualquier espacio de memoria que se reservadinámicamente con el operador new. Unavez que el espacio no es más requerido, sedebe hacer una liberación del espacio paraque éste pueda ser reutilizado por otrosusuarios. Para ello se hace uso del operadordelete. Programación II
  14. 14. Solicitudes dinámicasEjemplo: int *pI = new int(); … delete pI;NOTA: Si por alguna razón la reserva de espacio de memoria no es posible (por ejemplo cuando no hay más memoria disponible), el operador new retorna una dirección nula no válida equivalente a 0L. Programación II
  15. 15. Solicitudes dinámicasNOTA: Los apuntadores son un tipo particular de declaración que también requieren de un espacio de memoria para su representación y almacenamiento. Este espacio es equivalente al tipo de dato long. Esa es la razón porque un apuntador nulo es igual al literal 0L. Hay que tener cuidado de no hacer un delete con una dirección de memoria no válida. Programación II
  16. 16. Solicitudes dinámicasEjemplo: char *pC = new char(„A‟); if (pC == 0L) { cout << “Posible problema de memoria”; return; } … delete pC; Programación II
  17. 17. Estructuras continuas / linealesSon aquellas que ocupan un espacio dememoria (bloque) continuo (un byte al ladodel otro).Todas las declaraciones de tipos básicos sonlineales, tanto si se reservan de maneraestática como de manera dinámica.Es necesario tener una dirección de memoriaque permita llegar al bloque donde está laestructura. Programación II
  18. 18. Estructuras continuas / linealesVentajas: 1) Sólo se requiere una dirección de memoria para llegar al bloque acceso fácil a la información. 2) Una vez que se llega al bloque toda la data está accesible acceso rápido a la información. Programación II
  19. 19. Estructuras continuas / linealesDesventajas: 1) Es necesario conocer, ya sea en tiempo estático o dinámico, el número de bytes que se requiere para reservar el bloque su tamaño es estático, no puede crecer. 2) Para bloques de gran tamaño, es posible que se de el caso de no encontrar un espacio continuo lo suficientemente grande para satisfacer la necesidad (aún habiendo memoria disponible) posibles problemas de reserva de memoria. Programación II
  20. 20. Estructuras continuas / linealesNOTA: Las estructuras continuas son susceptibles al problema de fragmentación de memoria aún habiendo varios bytes de memoria disponibles, la alternación de bloques ocupados y libres hace que los espacios continuos sean más pequeños de los que se necesitan. Programación II
  21. 21. Estructuras continuas / lineales Programación II
  22. 22. Estructuras continuas / linealesDos clases de estructuras: 1) Arreglos: conjunto finito de elementos del mismo tipo. 2) Registros: conjunto finito de elementos de tipo diferente. Programación II
  23. 23. ArreglosPara su definición / declaración se requierentres cosas: 1) Conocer el tipo de dato único de todos sus elementos. 2) Conocer la cantidad de elementos del conjunto. 3) Dar un identificador válido para acceder a los elementos del conjunto. Programación II
  24. 24. ArreglosEjemplo: char Cadena[10];Cadena es un arreglo de 10 elementos detipo char. Cadena es también la dirección dememoria del espacio continuo donde sealmacenan los 10 elementos.Para acceder a los elementos del arreglo sehace uso de un índice que indica la posicióndel elemento en el conjunto. Programación II
  25. 25. ArreglosEn C++ el primer elemento se encuentra enla posición 0; para el ejemplo anterior, elúltimo elemento está en la posición 9.Los elementos de un arreglo se almacenanen memoria uno al lado del otro de acuerdo asu posición y conforme a la cantidad de bytesque ocupa cada elemento.Los arreglos también pueden ser inicializadosen tiempo de declaración. Programación II
  26. 26. ArreglosEjemplo: int V[3] = { 10, 20, 30 }; Inicialización en tiempo de declaración sizeof(int) … … … V V[0] = 10 V[1] = 20 V[2] = 30 dirección Programación II
  27. 27. ArreglosNótese que *V y V[0] son lo mismo. Engeneral, *(V+i) y V[i] son lo mismo.Para estimar el número de bytes que ocupala estructura en memoria basta multiplicar elnúmero de elementos por el tamaño en bytesdel tipo de dato de cada elemento. Para elejemplo anterior: 3 x sizeof(int) sizeof(V) Programación II
  28. 28. Arreglos¿Qué hacer cuando no se conoce a priori(estáticamente) el número de elementos? Porejemplo cuando se tiene que leer durante laejecución del programa.Hay que hacer reserva de espacio dinámicade memoria usar un apuntador o direcciónde memoria y los operadores new y delete. Programación II
  29. 29. Arreglos Programación II
  30. 30. ArreglosNótese que no es posible hacer: double V[N];A menos que N sea una constantepreviamente definida: const int N = 10;O una macro previamente definida: #define N 10 Programación II
  31. 31. Arreglos Programación II
  32. 32. Arreglos¿Cómo representar arreglos de más de unadimensión: matrices por ejemplo? 1 dimensión vector 2 dimensiones matriz bidimensional 3 dimensiones matriz tridimensional N dimensiones matriz híper-espacialSe agrega otro tamaño y se usa otro índicepara cada nueva dimensión. Programación II
  33. 33. ArreglosEjemplo: char M[2][2] = { { „A‟, „B‟ }, { „C‟, „D‟ } }; Inicialización en tiempo de declaración M[1][0] M[0][0] M[0][1] M[1][1] „A‟ „B‟ „C‟ „D‟ M Fila 0 Fila 1 dirección Programación II
  34. 34. ArreglosNótese que *M y M[0][0] son lo mismo. Engeneral, *(M+2*i+j) y M[i][j] son lo mismo.Para estimar el número de bytes que ocupala estructura en memoria basta multiplicar elnúmero de elementos de cada dimensión porel tamaño en bytes del tipo de dato de cadaelemento. Para el ejemplo anterior: 2 x 2 x sizeof(char) sizeof(M) Programación II
  35. 35. Arreglos Programación II
  36. 36. ArreglosPara hacer la reserva dinámica de espacio enarreglos de más de una dimensión se haceuso igual de apuntadores y los operadoresnew y delete.En algunas versiones del lenguaje NO esposible hacer: double *V = new double[N][M]; Programación II
  37. 37. Arreglos Programación II
  38. 38. Arreglos Programación II
  39. 39. ArreglosOtra solución es hacer vectores enlazados: [1][C-1] [0][C-1] Dirección … [0][1] [0][0]del arreglo [1][0] [1][1] … … [F-1][0] [F-1][1] … [C-1] [F-1] Vector de F F Vectores de apuntadores C elementos Programación II
  40. 40. Arreglos Programación II
  41. 41. RegistrosPara su definición / declaración se requierentres cosas: 1) Conocer el tipo de dato posiblemente diferente de cada uno de sus elementos. 2) Conocer el identificador único y válido de cada uno de sus elementos. 3) Dar un identificador válido para acceder a los elementos del conjunto. Programación II
  42. 42. RegistrosEn C++ se reconocen tres tipos de registros: 1) Estructuras: derivadas del lenguaje C. Se hace uso de la palabra reservada struct. 2) Registros invariantes (union): derivadas del lenguaje C. Se hace uso de la palabra reservada union. 3) Clases: agregadas en C++ para la programación orientada a objetos. Se hace uso de la palabra reservada class. Programación II
  43. 43. RegistrosLos registros pueden incluir tanto datos comométodos y se almacenan en memoria unelemento al lado del otro en el mismo ordensecuencial en el cual están definidos.Para el caso de los métodos la memoriacorrespondiente tiene el código del método óla dirección donde está el códigodependiendo si la definición es inline ó outlinerespectivamente. Programación II
  44. 44. RegistrosLas estructuras y registros invariantes, aligual que las clases, poseen declarativas deinterfaz (public, protected, private). Si no sedice nada por defecto los elementos sonpúblicos.Para acceder a los elementos se hace usodel operador „.‟ si se trata de una variable /objeto ó el operador „->‟ si se trata de unadirección de memoria. Programación II
  45. 45. RegistrosAl igual que se hace con los datos básicos,para acceder a la dirección de memoriateniendo una variable / objeto declarado sehace uso del operador „&‟.Las estructuras y registros invariantes sepueden anidar (definir en cascada uno dentrodel otro); las clases no. Programación II
  46. 46. RegistrosEjemplo: struct Tstr { int I; double D; char C; Tstr() { I = 0; D = 0.0; C = „0‟; } }; typedef Tstr *pTstr; Programación II
  47. 47. Registros Tstr st; pTstr stp = &st; st.I = 2; stp->D = 2.0; sizeof(int) sizeof(double) sizeof(char) … … … …&st stpdirección st.I stp->I st.D stp->D st.C stp->C st.Tstr() =2 = 2.0 = „1‟ stp->Tstr() Programación II
  48. 48. RegistrosPara obtener el número de bytes del bloquede memoria que ocupa un registro bastaaplicar el operador sizeof al tipo de dato quese define implícitamente o la variable / objetocorrespondiente. Para el caso anterior: sizeof(Tstr) sizeof(st) sizeof(*stp)Nótese que no es lo mismo sizeof(stp) quesizeof(*stp); el primero es el número de bytesque requiere un apuntador. Programación II
  49. 49. RegistrosEjemplo: struct Tiempo { struct Fecha { int D, M, A; } Fec; struct Hora { int H, M, S; } Hor; } t = { { 12, 8, 2010 }, { 11, 48, 0 } }; Programación II
  50. 50. RegistrosLa única característica que diferencia losregistros invariantes (union) de lasestructuras (struct) es que en los primerostodos los elementos ocupan el mismoespacio de memoria.Son útiles para administrar una misma data(memoria) haciendo uso de tipos de datodiferentes. Programación II
  51. 51. Registros sizeof(short) = 2 x sizeof(char) u.c[0] 0xAA u.c[1] 0xBB &u dirección Programación II
  52. 52. RegistrosEl número de bytes de un registro invariantecoincide con el número de bytes del elementoque más bytes ocupa en la estructura.Todos los elementos se organizan enmemoria de forma tal que empiezanexactamente con el primer byte de laestructura. Programación II
  53. 53. Estructuras complejasEstá claro que puede haber combinación dearreglos de arreglos, registros de registros,arreglos de registros y registros de arreglos.Es importante tener claro: 1) La manera como se organizan en el bloque de memoria. 2) La manera de obtener la dirección de memoria al bloque. 3) La manera en la que se accede a todos los elementos. Programación II
  54. 54. Estructuras complejasCada vez que se consigue en el camino unarreglo, se requieren tantos índices comodimensiones tenga el arreglo para acceder alelemento y se hace uso del operador dedireccionamiento „[ ]‟.Cada vez que se consigue en el camino unregistro, se requiere el operador „.‟ paraacceder al elemento que se desee. Programación II
  55. 55. Estructuras complejas Programación II
  56. 56. Estructuras complejas 3 x sizeof(STR1) = sizeof(VSTR1) sizeof(STR1) 4x 2x sizeof(char) sizeof(int) sizeof(double) … … … … VSTR1[1] VSTR1[2] VSTR1 cSTR2 iSTR2dirección STR2 dSTR1 STR1 VSTR1[0] Programación II
  57. 57. TAD particulares1) Conjuntos finitos hasta un máximo de elementos y sus respectivas operaciones: agregar, suprimir, pertenencia, cardinalidad, unión, intersección, diferencia, lleno, vacío.2) Pilas: conjuntos particulares cuyas operaciones de agregación/supresión siguen el algoritmo LIFO (Last In First Out – último en entrar, primero en salir). Programación II
  58. 58. TAD particulares3) Colas: conjuntos particulares cuyas operaciones de agregación/supresión siguen el algoritmo FIFO (First In First Out – primero en entrar, primero en salir).4) Dipolo: colas en los dos sentidos dos operaciones de agregación y dos operaciones de supresión. Programación II
  59. 59. TAD particulares3) Buffer circular: Se maneja como una cola pero no hay límite sobre los elementos a agregar. Primeros elementos agregados pueden ser reemplazados por nuevos elementos si la velocidad de agregación es mayor que la de supresión. Programación II
  60. 60. TAD particulares Programación II

×