TC1-301305-4

25
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNAD ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA ESTRUCTURA DE DATOS JUAN MANUEL OSORIO CARABALI COD 10.347.947 JULIO CESAR PULIDO CEPEDA COD xxxxxxx YIMMY ANTONIO AGUILAR COD 11 .312 .744 GRUPO COLABORATIVO 301305-4 TUTOR: HERMES MOSQUERA

Transcript of TC1-301305-4

Page 1: TC1-301305-4

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA – UNADESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA

ESTRUCTURA DE DATOS

JUAN MANUEL OSORIO CARABALICOD 10.347.947

 JULIO CESAR PULIDO CEPEDACOD xxxxxxx

 YIMMY ANTONIO AGUILARCOD 11 .312 .744

GRUPO COLABORATIVO 301305-4

TUTOR:

HERMES MOSQUERA

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA

22 DE OCTUBRE DE 2012

Page 2: TC1-301305-4

INTRODUCCIÓN

La intención principal de este trabajo es colocar en práctica todos los conceptos y conocimientos que durante este curso estamos obteniendo, similar a que todas las instrucciones que logremos efectuar en la guía de las estructuras de datos.

Además en este trabajo se introducirá el concepto de tipo indeterminado de variables estáticas y dinámicas y el uso de los operadores new y delete frente a al manejo de malloc y free.

Page 3: TC1-301305-4

DESARROLLO DE LA ACTIVIDAD

1. Conceptualización de la memoria dinámica.

De acuerdo a la conceptualización del módulo referente a la unidad 1 y a las consultas bibliográficas en la Biblioteca virtual de la UNAD, de respuesta en la Columna de la derecha a los siguientes interrogantes:

ENUNCIADO RESPUESTAEn la gestión dinámica de memoria ¿Qué utilidad tiene la función Malloc()?

Esta función se utiliza para la asignación y liberación de memoria dinámicamente.Cuando se ejecuta un programa, el sistema operativo reserva una zona de memoria para el código o instrucciones del programa y otra para las variables que se usan durante la ejecución. A menudo estas zonas son la misma zona, es lo que se llama memoria local. También hay otras zonas de memoria, como la pila, que se usa, entre otras cosas, para intercambiar datos entre funciones

¿Para qué es utilizado del operador delete en la gestión dinámica de memoria?

El operador Delete: Libera un bloque de memoria asignada por New en tiempo de ejecución, de manera semejante a como lo hace la función free ().

Establezca la diferencia relacionadas con el operador sizeof entre las dos instrucciones decódigo siguientes:

Instrucción 1.valor = (float * ) malloc (10 * sizeof (float));

Instrucción 2.valor = (float * ) malloc (sizeof (float));

sizeof: devuelve el tamaño de su argumentomalloc: devuelve un puntero a un bloque de memoria del tamaño dado por su argumento, entonces:

En la primera instrucción sizeof está multiplicando x 10; si float es por ejemplo 8 malloc va a devolver un bloque de tamaño 80 bytes

En la segunda instrucción solo va a devolver un bloque de 8bytes

Haga una consulta en la biblioteca virtual de la UNAD para indicar el concepto de apuntadores y la importancia en la programación de C++.

Un apuntador es una variable, que almacena como contenido una dirección de memoria, de otra variable a la que apunta, dicha dirección representa el lugardonde se almacena un dato. Los apuntadores tienen un tipo de dato

Page 4: TC1-301305-4

específico y solo pueden apuntar a espacios de memoria con datos del mismo tipo. En esa dirección de memoria puede haber cualquier tipo de objeto: un char, un int, un float, un array, una estructura, una función u otro puntero.El uso de apuntadores en C y C++ es muy importante debido a que permite hacer los programas más eficientes y más flexibles permiten accesar y manipular datos de tal manera que no es posible realizarse en otros lenguajes llamados de alto nivel También son útiles para pasarle parámetros a las funciones de tal modo que les permiten modificar y regresar valores a la rutina o función que hace el llamado.

2. Aplicación de los apuntadores.

Analice el siguiente código que es una parte de un programa como aplicación de Apuntadores a apuntadores, complete las líneas de código que faltan, compílelo y lo ejecuta y así confirma la salida en pantalla, documente cada una de las líneas de código y exprese el resultado que arrojan las variables: a, *x, **y, ***z, en las líneas de la 10 a la 13 para lo cual se debe realizar y anexar a este punto la prueba de escritorio.

Línea Código fuente

Documente cada línea de código y los resultados de la línea 10 a la 131 int main(){

2 int a=20;Se declara una Variable tipo entero y se le asigna el valor de 20. Que sería un valor continuo de la variable

3 int *x, **y, ***z ; Se declara tres apuntadores de tipo entero. Que son x,y, y z.

4 x = &a;

5 *x = 150;El apuntador x va almacenar el valor de 150.

6 y = &x ; asigna a y la dirección de x

7 **y += *x;almacena en y el valor de y mas el valor de x es decir 150 + 150 = 300

8 z = &y;asigna a z la dirección de y (z apunta a y)

9 ***z += **y + *x;

almacena en z el valor de z mas el valor de y mas el valor de x, es decir 300+300+300=900

Page 5: TC1-301305-4

10 cout << “\nEl valor de a es:”<<a; muestra el valor de a igual a 90011 cout << “\nEl valor de *x es:”<<*x; muestra el valor de x igual a 90012 cout <<”\nEl valor de **y es:”<<**y; muestra el valor de y igual a 90013 cout <<”\nEl valor de ***z es:”<<***z; muestra el valor de z igual a 900

14 system(“PAUSE”);

esta función mantiene detenida la pantalla para poder observar la ejecución del programa hasta cuando se pulsa una tecla

15 return 0; 16 }

NOMBRE DEL INTEGRANTE DEL GRUPO

PARTICIPACIÓN Y APORTE REALIZADO

JUAN MANUEL OSORIO CARABALI

Los aportes desarrollados por el compañero JUAN OSORIO son los aportes más codificados y completos no dejando de lado el trabajo del compañero JULIO CESAR a mi me gusta el punto 3 de julio por la escritura del código fuente que codifica envía la información a el usuario con una sola opción.

Page 6: TC1-301305-4

JULIO CESAR PULIDO CEPEDA

Los aportes realizado por el compañero julio cesar fueron de buen ayuda, para realizar los puntos que estaba planteados en la guía de trabajo, en el cual monto su aportes de los dos aportes del punto 3 y 4 , para llevar a cabo la selección del mejor ejercicio.Evaluación de Juan manual Osorio

YIMMY ANTONIO AGULAR

Page 7: TC1-301305-4

3. Aplicación de las estructuras y gestión dinámica de memoria con las funciones Malloc() y Free().Se requiere implementar un programa codificado en C++ que haga uso de la gestión dinámica de memoria con las funciones malloc() y free(), que por medio de un menú de opciones permita insertar y visualizar la información de tres cursos académicos en una estructura llamada Cursos que almacenará el código del curso, el nombre del curso y el número de créditos del curso. Como resultado se espera el código fuente debidamente documentado cada línea y la captura de pantalla de las imágenes de la salida en pantalla de cada opción.

#include <stdio.h> //Se incluyen la librería stdio.h para el buen funcionamiento del programa y soportar la sintaxis del lenguaje #include <conio.h> //Se incluyen la librería stdio.h para el buen funcionamiento del programa y soportar la sintaxis del lenguaje#include <stdlib.h> //Se incluyen la librería stdio.h para el buen funcionamiento del programa y soportar la sintaxis del lenguaje#include <iostream.h> //Se incluyen la librería stdio.h para el buen funcionamiento del programa y soportar la sintaxis del lenguaje

struct nodo { // Definimos la estructura de almacenamiento char codigo_curso[20]; //Se declara la variable codigo_curso tipo char char nombre_curso[30]; //Se declara la variable nombre_curso tipo char char creditos_curso[2]; //Se declara la variable creditos_curso tipo charstruct nodo *sig; //Apunta al nodo siguiente }curso_academico; //Tipo de dato curso_academico que es de tipo estructura nodostruct nodo *cab, *ult, *nuevo; //Declaramos los apuntadores *cab(para identificar el inicio de la estructura), *ult(para identificar cual es el último elemento de la estructura), *nuevo(para identificar cual es el nuevo elemento de la estructura)void encadenar()

//Se declara la función encadenar que no va retornar ningún valor {

//Se abre la llave indicando que inician las instrucciones de la función encadenar if (cab == NULL) //Se verifica si la estructura se encuentra vacía { cab = nuevo; //El apuntador cab apunta nuevo ult = nuevo; //El apuntador ult apunta nuevo } //Se cierra la llave finalizando el condicional si else { ult -> sig = nuevo; //Si la estructura no esta vacia el último nodo de la estructura se está conectando al nuevo nodo ult = nuevo; //El apuntador ult apunta a nuevo } //Se cierra la llave finalizando el condicional entonces } //Se cierra la llave finalizando la funcion encadenar void insertar() //Se declara la función insertar que no va retornar ningún valor

Page 8: TC1-301305-4

{ //Se abre la llave indicando que inician las instrucciones de la función insertar int i; //Se declara la variable i tipo entero if(cab == NULL) //Se verifica si la estructura se encuentra vacía ult=NULL; //Si la estructura está vacía, al apuntador ult apunta a NULL (nada) nuevo =(struct nodo*) malloc (sizeof(curso_academico)); //Se crea un nuevo nodo con los campos de la estructura curso_academico cout << "\n REGISTRO DE DATOS \n\n"; //Se despliega un mensaje en pantalla for(i=1;i<=3;i++) //Ciclo for usado para el ingreso de los cursos { //Se abre la llave indicando que inician las instrucciones del ciclo for cout << "Digite el codigo del curso No. "<< i <<" : "; //Se despliega un mensaje en pantalla cin >> nuevo[i].codigo_curso; //Asigna el valor digitado al campo codigo_curso del nodo apuntado por nuevo[i] cout << "Digite el nombre del curso No. "<< i <<" : "; //Se despliega un mensaje en pantalla cin >> nuevo[i].nombre_curso; //Asigna el valor digitado al campo nombre_curso del nodo apuntado por nuevo[i] cout << "Digite los creditos del curso No. "<< i <<": "; //Se despliega un mensaje en pantalla cin >> nuevo[i].creditos_curso; //Asigna el valor digitado al campo creditos_curso del nodo apuntado por nuevo[i] cout << "\n\n"; //Se realiza un salto de línea } //Se cierra la llave finalizando el condicional for cout << "\n----- FIN INGRESO -----\ "; //Se despliega un mensaje en pantalla getch(); //La función getch() que hace la ejecución del programa termine solo cuando se presione una tecla encadenar(); //Se llama la función encadenar que es donde se integra el nuevo nodo a la estructura } //Se cierra la llave indicando que termina la función insertarvoid listar() //Se declara la función listar que no va retornar ningún valor { /Se abre la llave indicando que inician las instrucciones de la función listar int i; //Se declara la variable i tipo int clrscr(); //Se limpia pantalla por medio de la función clrscr() para que las salidas en pantalla de anteriores ejecuciones sigan mostrándose if (cab==NULL) //Se verifica si la estructura se encuentra vacía cout << "\nNO HAY CURSOS REGISTRADOS\n\n"; //Se despliega un mensaje en pantalla else cout << "\nLISTADO DE CURSOS REGISTRADOS\n\n"; //Se despliega un mensaje en pantalla for(i=1;i<=3;i++) //Condición que nos permite mostrar los datos ingresados en la estructura { //Se abre la llave indicando que inician las instrucciones del condicional for cout << "\nCodigo curso No."<< i <<" : "<< nuevo[i].codigo_curso<<""; //Muestra el contenido de la variable codigo_curso del nodo que es apuntado por el apuntador nuevo[i] en la estructura cout << "\nNombre curso No."<< i <<" : "<< nuevo[i].nombre_curso<<"";

Page 9: TC1-301305-4

//Muestra el contenido de la variable nombre_curso del nodo que es apuntado por el apuntador nuevo[i] en la estructura cout << "\nCreditos curso No."<< i <<": "<< nuevo[i].creditos_curso<<""; //Muestra el contenido de la variable creditos_curso del nodo que es apuntado por el apuntador nuevo[i] en la estructura cout << "\n\n"; //Se realiza un salto de línea } //Se cierra la llave indicando que cierra las instrucciones del ciclo for cout << "\n----- FIN LISTADO -----\ "; //Se despliega un mensaje en pantalla getch(); //La función getch() que hace la ejecución del programa termine solo cuando se presione una tecla }

//Se cierra la llave indicando que termina la función listarvoid main() //Se define la función principal main() de tipo void, lo que indica que no retorna ningún valor { //Se abre la llave indicando que inician las instrucciones de la función principal int opc; //Define un campo de memoria opc tipo entero. opc=0; //El campo de memoria opc se está inicializando con 0 cab=NULL; //Si la estructura está vacía, al apuntador cab apunta a NULL (nada) while (opc !=3) //Condición que controla el ciclo repetitivo el cual se ejecuta mientras opc tenga un valor diferente de 3 { //Se abre la llave indicando que inician las instrucciones del condicional mientras clrscr(); //Se limpia pantalla por medio de la función clrscr() para que las salidas en pantalla de anteriores ejecuciones sigan mostrándose gotoxy(33,7); cout << ">> MENU <<"; //Posiciona el mensaje o la salida en pantalla "MENU" en las coordenadas x=33 y y=7 gotoxy(25,10); cout << "1. Insertar Cursos Academicos"; //Posiciona el mensaje o la salida en pantalla "1. Insertar Elementos" en las coordenadas x=25 y y=10 gotoxy(25,12); cout << "2. Listar Cursos Academicos"; //Posiciona el mensaje o la salida en pantalla "2. Listar Elementos" en las coordenadas x=25 y y=12 gotoxy(25,14); cout << "3. Salir"; //Posiciona el mensaje o la salida en pantalla "3. Salir" en las coordenadas x=25 y y=14 gotoxy(23,17); cout << "Digite la opcion deseada< _ >"; //Posiciona el mensaje o la salida en pantalla ""Digite la opcion deseada< _ >"" en las coordenadas x=23 y y=17 gotoxy(49,17); cin >> opc; //Se almacena el valor que el usuario haya digitado de acuerdo al menú de opciones cout << "\n\n"; //Se realiza un salto de línea clrscr(); //Se limpia pantalla por medio de la función clrscr() if(opc==1) insertar(); /Es un condicional que evalúa el contenido de opc, si es 1 llama la función insertar else if(opc==2) listar(); //Es un condicional que evalúa el contenido de opc, si es 2 llama la función listar else if(opc!=3) //Es un condicional que evalúa el contenido de opc, si es 3 { //Se abre la llave indicando que inician las instrucciones del condicional entonces cout <<"ERROR. Opcion incorrecta!"; //Se despliega un mensaje en pantalla

Page 10: TC1-301305-4

getch(); //Se introduce la función getch() que hace la ejecución del programa termine solo cuando se presione una tecla } //Se cierra la llave indicando que se cierran las instrucciones del condicional entonces } //Se cierra la llave indicando que se cierran las instrucciones del condicional mientras clrscr(); //Se limpia pantalla por medio de la función clrscr() para que las salidas en pantalla de anteriores ejecuciones sigan mostrándose gotoxy(30,10); cout << ">> FIN DEL PROGRAMA <<"; //Posiciona el mensaje o la salida en pantalla "FIN DEL PROGRAMA" en las coordenadas x=30 y y=10 gotoxy(30,11); cout << "Presione una tecla para Terminar."; //Posiciona el mensaje o la salida en pantalla "Presione una tecla para Terminar." en las coordenadas x=30 y y=11 free(cab); //Elimina el apuntador cab, liberando la estructura del control del programa getch(); //Se introduce la función getch() que hace la ejecución del programa termine solo cuando se presione una tecla }

Page 11: TC1-301305-4
Page 12: TC1-301305-4

4. Aplicación de las estructuras y gestión dinámica de memoria con los Operadores New y Delete.

Implemente un programa en C++ que haga uso de la gestión dinámica de memoria a través de los operadores New y Delete, que permita insertar y visualizar los datos básicos de 3 programas académicos de la UNAD, haciendo uso de una estructura llamada Programas que almacenará el código del programa, el nombre del programa. Como resultado se espera el código fuente debidamente documentado cada línea y la captura de pantalla de las imágenes dela salida en pantalla de cada opción.

#include <conio.h> //Se incluyen la librería stdio.h para el buen funcionamiento del programa y soportar la sintaxis del lenguaje#include <iostream.h> //Se incluyen la librería stdio.h para el buen funcionamiento del programa y soportar la sintaxis del lenguaje

struct programa { //Definimos la estructura de almacenamiento char codigo_programa[20]; //Se declara la variable codigo_programa tipo char char nombre_programa[30]; //Se declara la variable nombre_programa tipo charstruct programa *sig; //Apunta al nodo siguiente }programa_academico; //Tipo de dato programa_academico que es de tipo estructura programastruct programa *cab, *ult, *nuevo; //Declaramos los apuntadores *cab(para identificar el inicio de la estructura), *ult(para identificar cual es el último elemento de la estructura), *nuevo(para identificar cual es el nuevo elemento de la estructura)void encadenar() //Se declara la función encadenar que no va retornar ningún valor { //Se abre la llave indicando que inician las instrucciones de la función encadenar if (cab == NULL) //Se verifica si la estructura se encuentra vacía { cab = nuevo; //El apuntador cab apunta nuevo ult = nuevo; //El apuntador ult apunta nuevo } //Se cierra la llave finalizando el condicional si else { ult -> sig = nuevo; //Si la estructura no esta vacia el último nodo de la estructura se está conectando al nuevo nodo ult = nuevo; //El apuntador ult apunta a nuevo } //Se cierra la llave finalizando el condicional entonces } //Se cierra la llave finalizando la funcion encadenarvoid insertar() //Se declara la función insertar que no va retornar ningún valor { //Se abre la llave indicando que inician las instrucciones de la función insertar

Page 13: TC1-301305-4

int i; //Se declara la variable i tipo entero if(cab == NULL) //Se verifica si la estructura se encuentra vacía ult=NULL; //Si la estructura está vacía, al apuntador ult apunta a NULL (nada) nuevo = new(programa); //Se crea un nuevo nodo de tipo struct programa y queda direccionado por el apuntador cout << "\n REGISTRO DE DATOS \n\n"; //Se despliega un mensaje en pantalla for(i=1;i<=3;i++) //Ciclo for usado para el ingreso de los programas { //Se abre la llave indicando que inician las instrucciones del ciclo for cout << "Digite el codigo del programa No. "<< i <<" : "; //Se despliega un mensaje en pantalla cin >> nuevo[i].codigo_programa; //Asigna el valor digitado al campo codigo_programa del nodo apuntado por nuevo[i] cout << "Digite el nombre del programa No. "<< i <<" : "; //Se despliega un mensaje en pantalla cin >> nuevo[i].nombre_programa; //Asigna el valor digitado al campo nombre_programa del nodo apuntado por nuevo[i] cout << "\n\n"; //Se realiza un salto de línea } //Se cierra la llave finalizando el condicional for cout << "\n----- FIN INGRESO -----\ "; //Se despliega un mensaje en pantalla getch(); //La función getch() que hace la ejecución del programa termine solo cuando se presione una tecla encadenar(); //Se llama la función encadenar que es donde se integra el nuevo nodo a la estructura } //Se cierra la llave indicando que termina la función insertarvoid listar() //Se declara la función listar que no va retornar ningún valor { //Se abre la llave indicando que inician las instrucciones de la función listar int i; //Se declara la variable i tipo entero clrscr(); //Se limpia pantalla por medio de la función clrscr() para que las salidas en pantalla de anteriores ejecuciones sigan mostrándose if (cab==NULL) //Se verifica si la estructura se encuentra vacía cout << "\nNO HAY PROGRAMAS REGISTRADOS\n\n"; //Se despliega un mensaje en pantalla else cout << "\nLISTADO DE PROGRAMAS REGISTRADOS\n\n"; //Se despliega un mensaje en pantalla for(i=1;i<=3;i++) //Condición que nos permite controlar el final de datos de la estructura { //Se abre la llave indicando que inician las instrucciones del condicional mientras cout << "\n\nCodigo programa No."<< i <<":"<< nuevo[i].codigo_programa<<"\n"; //Muestra el contenido de la variable codigo_programa del nodo que es apuntado por el apuntador nuevo[i] en la estructura cout << "\n\nNombre programa No."<< i <<":"<< nuevo[i].nombre_programa<<"\n"; //Muestra el contenido de la variable nombre_programa del nodo que es apuntado por el apuntador nuevo[i] en la estructura cout << "\n\n"; //Se realiza un salto de línea

Page 14: TC1-301305-4

} //Se cierra la llave indicando que cierra las instrucciones del ciclo for cout << "\n----- FIN LISTADO -----\ "; //Se despliega un mensaje en pantalla getch(); //La función getch() que hace la ejecución del programa termine solo cuando se presione una tecla } //Se cierra la llave indicando que termina la función listarvoid main() //Se define la función principal main() de tipo void, lo que indica que no retorna ningún valor { //Se abre la llave indicando que inician las instrucciones de la función principal int opc; //Define un campo de memoria opc tipo entero. opc=0; ///El campo de memoria opc se está inicializando con 0 cab=NULL; //Si la estructura está vacía, al apuntador cab apunta a NULL (nada) while (opc !=3) //Condición que controla el ciclo repetitivo el cual se ejecuta mientras opc tenga un valor diferente de 3 { //Se abre la llave indicando que inician las instrucciones del condicional mientras clrscr(); //Se limpia pantalla por medio de la función clrscr() para que las salidas en pantalla de anteriores ejecuciones sigan mostrándose gotoxy(33,7); cout << ">> MENU <<"; //Posiciona el mensaje o la salida en pantalla "MENU" en las coordenadas x=33 y y=7 gotoxy(25,10); cout << "1. Insertar Programas Academicos"; //Posiciona el mensaje o la salida en pantalla "1. Insertar Programas Academicos" en las coordenadas x=25 y y=10 gotoxy(25,12); cout << "2. Listar Programas Academicos"; //Posiciona el mensaje o la salida en pantalla "2. Listar Programas Academicos" en las coordenadas x=25 y y=12 gotoxy(25,14); cout << "3. Salir"; //Posiciona el mensaje o la salida en pantalla "3. Salir" en las coordenadas x=25 y y=14 gotoxy(23,17); cout << "Digite la opcion deseada< _ >"; //Posiciona el mensaje o la salida en pantalla ""Digite la opcion deseada< _ >"" en las coordenadas x=23 y y=17 gotoxy(49,17); cin >> opc; //Se almacena el valor que el usuario haya digitado de acuerdo al menú de opciones cout << "\n\n"; //Se realiza un salto de línea clrscr(); //Se limpia pantalla por medio de la función clrscr() para que las salidas en pantalla de anteriores ejecuciones sigan mostrándose if(opc==1) insertar(); // Es un condicional que evalúa el contenido de opc, si es 1 llama la función insertar else if(opc==2) listar(); //Es un condicional que evalúa el contenido de opc, si es 2 llama la función listar else if(opc!=3) //Es un condicional que evalúa el contenido de opc, si es 3 { //Se abre la llave indicando que inician las instrucciones del condicional entonces cout <<"ERROR. Opcion incorrecta!"; //Se despliega un mensaje en pantalla

Page 15: TC1-301305-4

getch(); //Se introduce la función getch() que hace la ejecución del programa termine solo cuando se presione una tecla } //Se cierra la llave indicando que se cierran las instrucciones del condicional entonces } //Se cierra la llave indicando que se cierran las instrucciones del condicional mientras clrscr(); //Se limpia pantalla por medio de la función clrscr() para que las salidas en pantalla de anteriores ejecuciones sigan mostrándosem gotoxy(30,10); cout << ">> FIN DEL PROGRAMA <<"; //Posiciona el mensaje o la salida en pantalla "FIN DEL PROGRAMA" en las coordenadas x=30 y y=10 gotoxy(30,11); cout << "Presione una tecla para Terminar."; //Posiciona el mensaje o la salida en pantalla "Presione una tecla para Terminar." en las coordenadas x=30 y y=11 delete cab; //Elimina el apuntador cab, liberando la estructura del control del programa getch(); //Se introduce la función getch() que hace la ejecución del programa termine solo cuando se presione una tecla }

Page 16: TC1-301305-4
Page 17: TC1-301305-4
Page 18: TC1-301305-4

BIBLIOGRAFÍA

Universidad nacional abierta y a distancia – unad, escuela de ciencias básicas tecnología e ingeniería, contenido didáctico del curso: 301305 – estructura de datos. Hermes Mosquera Angulo (director nacional) Popayán enero de 2011