estructuras de datos dinámicas en c (pt. 2)

28
Organización de Computadoras Organización de Computadoras Depto. Cs. e Ing. de la Comp. Depto. Cs. e Ing. de la Comp. Universidad Nacional del Sur Universidad Nacional del Sur Estructuras de Datos Estructuras de Datos Dinámicas en C Dinámicas en C (Pt. 2) (Pt. 2)

Upload: others

Post on 15-Oct-2021

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de ComputadorasOrganización de ComputadorasDepto. Cs. e Ing. de la Comp.Depto. Cs. e Ing. de la Comp.Universidad Nacional del SurUniversidad Nacional del Sur

Estructuras de Datos Estructuras de Datos Dinámicas en CDinámicas en C

(Pt. 2)(Pt. 2)

Page 2: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 22

CopyrightCopyrightCopyright © 2011-2021 A. G. Stankevicius

Se asegura la libertad para copiar, distribuir y modificar este documento de acuerdo a los términos de la GNU Free Documentation License, Versión 1.2 o cualquiera posterior publicada por la Free Software Foundation,sin secciones invariantes ni textos de cubierta delantera o trasera

Una copia de esta licencia está siempre disponible enla página http://www.gnu.org/copyleft/fdl.html

La versión transparente de este documento puede ser obtenida de la siguiente dirección:

http://cs.uns.edu.ar/~ags/teaching

Page 3: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 33

ContenidosContenidosConcepto de puntero

Pasaje por valor y por referencia

Tipos de datos estructurados

Gestión de la memoria dinámica

Estructuras de datos dinámicas

Concepto de posición directa e indirecta

Fases de la compilación

Parámetros en la línea de comandos

Page 4: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 44

Memoria dinámicaMemoria dinámicaLa declaración de toda variable reservaun espacio de tamaño previamente conocidoen el registro de activación en curso

El espacio reservado para las variables de tiposde datos elementales coincide con lo retornadopor la función sizeof() al ser aplicada a ese tipo

El espacio reservado para las variables de tipos de datos estructurados coincide con la suma del espacio reservado para cada uno de sus componentes

Por otra parte, también es posible gestionarla reserva y liberación de memoria dinámica

Page 5: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 55

Memoria dinámicaMemoria dinámicaC cuenta con las siguientes funciones de librería para la gestionar la asignación de memoria dinámica:

void* malloc(size_t): esta función intenta reservar la cantidad indicada de memoria dinámica

free(void*): esta función libera la porciónde memoria dinámica que comienza donde se indica

void* realloc(void*, size_t): esta función reajusta al tamaño solicitado el espacio de memoria dinámica que comienza donde se indica

Page 6: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 66

Memoria dinámicaMemoria dinámicaAl terminar de hacer uso de grandes estructuras dinámicas enlazadas se debe tener cuidado al liberar el espacio que ocupaban

La invocación a free() sólo libera el espacio reservado por el malloc() que generóel puntero pasado como argumento

Si una estructura se armó mediante múltiples invocaciones a malloc(), su espacio deberáser retornado mediante múltiples invocacionesa free()

¡IMPORTANTE!

Page 7: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 77

Memoria dinámicaMemoria dinámicaint *i;

char *c;

struct persona *p;

i = (int *) malloc(sizeof(int));

c = (char *) malloc(sizeof(char));

p = (struct persona *)

malloc(sizeof(struct persona));

free(i);

c = (char *) realloc(c, sizeof(char) * 9);

Page 8: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 88

Java vs. CJava vs. CHasta ahora los lenguajes de programación Java y C han compartido bastantes similitudes, sobre todo a nivel de sintaxis

En este punto aparece una diferencia que estamos obligados a tener siempre en cuenta:

Java se hace cargo por completo de la recuperación de la memoria dinámica asignada a un objeto cuyo uso finalizó

C, en contraste, deja esa tarea por completoen manos del programador

Page 9: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 99

ListasListasRecordemos las principales característicasde la estructura de datos dinámica “lista”:

Es una estructura de datos dinámica

El espacio ocupado por sus elementos es asignadoa medida que se necesite

Cada elemento apunta al siguiente, determinandouna relación lineal

Puede ser simple o doblemente enlazada

Permite implementar pilas y colas

Page 10: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1010

ListasListasstruct celda {

tipo elemento;

struct celda *sig;

};

elto sig

elto sig

elto sig

elto sig

Page 11: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1111

ListasListasRecordemos algunas de las peculiaridadesde esta estructura de datos:

Los elementos usualmente son todos del mismo tipo

Por lo general, cada celda es creada por separado invocando repetidamente a la función malloc()

Cada celda apunta a la siguiente

La última celda apunta a NULL

La lista completa se representa mediante un puntero al primer elemento

Page 12: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1212

Posición directa vs. indirectaPosición directa vs. indirectaLa posición de un elemento denota su ubicación dentro de la lista

Existen principalmente dos variantes parael concepto de posición:

Posición directa: la posición se denota medianteun puntero a la celda conteniendo el elemento deseado

Posición indirecta: la posición se denota medianteun puntero a una celda conteniendo un punteroa la celda conteniendo el elemento deseado

Page 13: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1313

Posición directa vs. indirectaPosición directa vs. indirectaConsiderando el elemento elto, el puntero pd representa su posición directa y pi su posición indirecta:

- sig

- sig

elto sig

- sig

pi

pd

Page 14: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1414

Inserción en listasInserción en listasVeamos cómo agregar una nueva celda *cel a continuación del elemento en la posición *pd (usando el concepto de posición directa):

struct celda *cel, *pd;

10 sig

25 sig

20 sig

30 sig

pd

cel

Page 15: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1515

¿cómo hago paraacceder a esta celda?

Inserción en listasInserción en listasVeamos cómo agregar una nueva celda *cel antes que el elemento en la posición *pd (usando el concepto de posición directa):

struct celda *cel, *pd;

10 sig

15 sig

20 sig

30 sig

pd

cel

Page 16: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1616

Inserción en listasInserción en listasPara agregar un elemento a una lista antesde otro hace falta poder acceder al elemento anterior en la lista

Esto se puede resolver de varias formas, siempre pagando algún costo:

Recorriendo la lista desde el principio

Haciendo uso de posición indirecta en vez de directa

Implementando una lista doblemente enlazada

¿Qué costo pago en cada caso?

Page 17: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1717

Fases de la compilaciónFases de la compilaciónCompilación (traducción):

Preprocesado

Generación de código assembler

Generación de código objeto

Enlazado o vinculación:

Enlazado con otros archivos objeto

Enlazado con librerías estándar

Generación del ejecutable

Page 18: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1818

.c

.exe

.c .s

.o

.o.o.o

preprocesadogeneración de

código assembler

compilación ensamblado

enlazado

librerías estándaresy del usuario

.a.a

Fases de la compilaciónFases de la compilación

Page 19: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1919

Directrices al preprocesadorDirectrices al preprocesadorLas directrices al preprocesador son interpretadas antes de la compilación:

#define: define una nueva constante o macrodel preprocesador

#include: indica que se debe incluir el contenidode otro archivo en el punto indicado

#ifdef, #ifndef: señala el comienzo de un bloquede preprocesamiento condicionado

#endif: marca el fin de un bloquede preprocesamiento condicionado

Page 20: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2020

Constantes y macrosConstantes y macrosEl preprocesador permite asociar valores constantes a ciertos identificadores que serán expandidos antes de la compilación propiamente dicha:

#define variable valor-cte

Análogamente, las macros son funciones que han de ser expandidas antes de la compilación:

#define macro(args, ...) def-función

Page 21: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2121

Constantes y macrosConstantes y macros#define PI 3.14

#define CANT 5

#define AREA(rad) PI * rad * rad

#define MAX(a, b) (a > b ? a : b)

int main() {

int i; float vector[CANT];

for(i = 0; i < CANT; i++)

vector[i] = MAX(i * 5.2, AREA(i));

}

Page 22: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2222

Archivos de encabezamientoArchivos de encabezamientoLos archivos de encabezamientos incluidos mediante la directiva #include suelen tenerla extensión “.h”

Las funciones declaradas en los archivosde encabezamiento no incluyen sus implementaciones

Las variables que allí aparezcan están declaradas como extern, ya que su definición ha de figurar en otro archivo fuente (el “.c” asociado a ese “.h”)

Page 23: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2323

Preprocesado condicionalPreprocesado condicionalPara incluir código cuya compilación dependa de ciertas circunstancias, se puede hacer uso de las siguientes directivas:

#ifdef variable

<bloque de sentencias>

#endif

#ifndef variable

<bloque de sentencias>

#endif

Page 24: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2424

Preprocesado condicionalPreprocesado condicional#define DEBUG

int main() {

int i, acc;

for (i = 0; i < 10; i++)

acc = i * i - 1;

#ifdef DEBUG

printf(“fin del bucle: %d”, acc);

#endif

}

Page 25: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2525

Conversión de tiposConversión de tiposC cuenta con diversas funciones de libreríapara asistir al programador en la conversión entre tipos de datos:

int atoi(char*): traduce de strings a enteros

long atol(char*): traduce de strings a enteros largos

double atof(char*): traduce de strings a reales

char* itoa(char*, int): traduce de enterosa strings

Page 26: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2626

Argumentos en líneaArgumentos en líneaEn C torna simple acceder a los argumentos suministrados en la línea de comandos:

void main(int argc, char *argv[]) {

int i;

printf(“%d argumentos”, argc);

for (i = 1; i < argc; i++) {

printf(“%d: %s\n”, i, argv[i]);

}

}

Page 27: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2727

Argumentos en líneaArgumentos en líneaCabe acotar que la convención es que el primer argumento es el nombre del programa que se está ejecutando

printf(“Invocado como: %s”,argv[0]);

Es decir, los argumentos en las las restantes posiciones (de 1 a argc-1), son los argumentos en la línea de comando efectivos

Nótese que los argumentos se reciben como cadenas de caracteres, incluso al tratarse de números

Page 28: Estructuras de Datos Dinámicas en C (Pt. 2)

Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2828

¿¿Preguntas?Preguntas?