1 / 39

Memoria Dinámica

Memoria Dinámica. Estructura de Datos. Concepto de estructura. Una estructura es un conjunto de una o m á s variables, de distinto tipo , agrupadas bajo un mismo nombre para que su manejo sea m á s sencillo.

alvaro
Download Presentation

Memoria Dinámica

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Memoria Dinámica Estructura de Datos

  2. Concepto de estructura • Una estructuraes un conjunto de una o más variables, de distinto tipo, agrupadas bajo un mismo nombre para que su manejo sea más sencillo. • Su utilización más habitual es para la programación de bases de datos, ya que están especialmente indicadas para el trabajo con registros o fichas.

  3. Ejemplo de estructura struct trabajador { char nombre[20]; int matricula; }; Nombre matricula Esto es una estructura de tipo trabajador. (un nodo)

  4. Nombre matricula *ptr Ejemplo de estructura con memoria dinámica (apuntadores) struct trabajador { char nombre[20]; int matricula; struct trabajador * ptr; }; Se le agrega un campo final del tipo apuntador a la misma estructura de donde proviene. Esto es una estructura de tipo trabajador. (un nodo)

  5. Recorrido para visualizar o mostrar una estructura por valor (osea trabajando variables) void visualizar(struct trabajador datos) { printf("Nombre:%s",datos.nombre); printf("\nApellidos:%s",datos.apellidos); printf("\nEdad: %d",datos.edad); printf("\nPuesto: %s",datos.puesto); } Recibe una variable datos de tipo estructura y se maneja los campos con “.” punto

  6. Recorrido para visualizar o mostrar una estructura por referencia (osea trabajando apuntadores) void visualizar(struct trabajador *datos) { printf("Nombre: %s",datos->nombre); printf("\nApellidos: %s",datos->apellidos); printf("\nEdad: %d",datos->edad); printf("\nPuesto: %s",datos->puesto); } Puntos importantes a checar: • En el parametro entra ahora un puntero • Al manejar el campo de cada registro no se usa el “.” PUNTO sino una -> FLECHA

  7. Como se declara un apuntador a estructura? • Recuerdas como declarar un apuntador? • Recuerdas que requiere especificar a que tipo de dato apunta? • Ej. • Int *a; • Char *s1; El asterisco indica que no es una variable comun sino Que es una variable apuntadora, y lo que esta a la izq. Indica el tipo de dato a apuntar. Entonces esto es un apuntador a un entero Aquí estamos declarando un apuntador a un dato char Entonces Como se declara un apuntador a estructura?, Primero recordaremos Estructura de datos…..

  8. Entonces como declaramos apuntador a estructura? struct trabajador { char nombre[20]; int matricula; struct trabajador * ptr; }; NECESITO UN APUNTADOR A ESTA ESTRUCTURA!!!! Sintaxis: Tipo estructura puntero Como declaramos ese tipo estructura?

  9. Como se declara un tipo estructura? Typedef struct nuevonodo { Int matricula; Struct nuevonodo *siguiente } alumno; Entonces aquí decimos que alumno es el nuevo tipo de dato de tipo nuevonodo y podemos decir entonces: Alumno*ptr; aquí decimos que *ptr es puntero a un nodo de la estructura.

  10. REFLEXIONEMOS… • Ya se como se declara una estructura para manejarse por referencia, osea con memoria dinamica. • Ya se como se accesan los campos haciendo uso de los apuntadores. • Ya se declarar un tipo de dato de la estructura • Ya se declarar un apuntador a una estructura. • Pero… • Como voy creando los nodos (un cuadrito de estructura) con memoria dinamica?

  11. Malloc • Malloc: Se utiliza para la asignación dinámica de bloques de memoria solicitados de acuerdo a los parámetros enviados. Como parámetro se le envía el tamaño del dato para poder reservar la suficiente memoria. Esta función regresará la dirección de memoria asignada a la estructura solicitada • Para utilizar esta función es necesario hacer uso de la librería stdlib.h • Sintaxis: Ptr=malloc(size(alumno)) EL PUNTERO ptr ESTA APUNTANDO A LA DIRECCION DE MEMORIA DONDE SE RESERVÓ EL TAMAÑO DE LA ESTRUCTURA

  12. #include <conio.h>#include <stdio.h>#include <stdlib.h>/* Para utilizar malloc*/ typedef struct _nodo{ int matricula; struct _nodo *siguiente;} alumno; Matrícula * siguiente Se esta decrarando un tipo de estructura “alumno” con la estructura _nodo que contiene 2 campos: matricula y *siguiente

  13. #include <conio.h>#include <stdio.h>#include <stdlib.h>/* Para utilizar malloc*/typedef struct _nodo{ int matricula; struct _nodo *siguiente;} alumno;typedef alumno *pNodo;typedef alumno *Lista; Apuntador *pNodo, *Lista a estructura alumno Matrícula * siguiente

  14. void main() { int i,n; clrscr(); printf("\n probando listas"); getch(); Lista lista=NULL; pNodo p; for (i=0;i<4;i++) { printf("\n dame la matricula del alumno %d",i+1); scanf("%d",&n); insertar(&lista,n); } MostrarLista(lista); printf("\n dame la matricula que quieres borrar"); scanf("%d",&n); Borrar(&lista,n); MostrarLista(lista); getch(); } Se declara el apuntador lista del tipo Lista (tipo alumno) en Nulo (NULL) ya que apenas vamos a comenzar el proceso de creaciòn de listas. Recordar que NULL significa VACÎO

  15. void main() { int i,n; clrscr(); printf("\n probando listas"); getch(); Lista lista=NULL; pNodo p; for (i=0;i<4;i++) { printf("\n dame la matricula del alumno %d",i+1); scanf("%d",&n); insertar(&lista,n); } MostrarLista(lista); printf("\n dame la matricula que quieres borrar"); scanf("%d",&n); Borrar(&lista,n); MostrarLista(lista); getch(); } Se declara el apuntador p del tipo pNodo (tipo alumno)

  16. void main() { int i,n; clrscr(); printf("\n probando listas"); getch(); Lista lista=NULL; pNodo p; for (i=0;i<4;i++) { printf("\n dame la matricula del alumno %d",i+1); scanf("%d",&n); insertar(&lista,n); } MostrarLista(lista); printf("\n dame la matricula que quieres borrar"); scanf("%d",&n); Borrar(&lista,n); MostrarLista(lista); getch(); } Ciclo que inserta 4 matrículas dentro de la lista , la cual fue anteriormente inicializada en NULL.

  17. void main() { int i,n; clrscr(); printf("\n probando listas"); getch(); Lista lista=NULL; pNodo p; for (i=0;i<4;i++) { printf("\n dame la matricula del alumno %d",i+1); scanf("%d",&n); insertar(&lista,n); } MostrarLista(lista); printf("\n dame la matricula que quieres borrar"); scanf("%d",&n); Borrar(&lista,n); MostrarLista(lista); getch(); } Se manda el control a la función insertar con parámetros (dirección inicial de la lista, y el valor de la matrícula a insertar).

  18. Recibe del main los parámetros de el contenido de la estructura de la lista y el valor que insertaremos=matrícula void insertar(Lista *lista, int v) { pNodo nuevo, anterior; nuevo=(pNodo)malloc(sizeof(alumno)); nuevo->matricula=v; if (*lista==NULL) { nuevo->siguiente=NULL; *lista=nuevo; } else { anterior=*lista; while(anterior->siguiente) anterior=anterior->siguiente; nuevo->siguiente = anterior->siguiente; anterior->siguiente = nuevo; } }

  19. void insertar(Lista *lista, int v) { pNodo nuevo, anterior; nuevo=(pNodo)malloc(sizeof(alumno)); nuevo->matricula=v; if (*lista==NULL) { nuevo->siguiente=NULL; *lista=nuevo; } else { anterior=*lista; while(anterior->siguiente) anterior=anterior->siguiente; nuevo->siguiente = anterior->siguiente; anterior->siguiente = nuevo; } } Declaración de dos punteros nuevo y anterior a la estructura pNodo

  20. void insertar(Lista *lista, int v) { pNodo nuevo, anterior; nuevo=(pNodo)malloc(sizeof(alumno)); nuevo->matricula=v; if (*lista==NULL) { nuevo->siguiente=NULL; *lista=nuevo; } else { anterior=*lista; while(anterior->siguiente) anterior=anterior->siguiente; nuevo->siguiente = anterior->siguiente; anterior->siguiente = nuevo; } } Malloc-> funciòn que solicita un espacio en memoria del tamaño (sizeof) de la estructura alumno. Se asigna a nuevo un puntero de tipo pNodo a la dirección dada por malloc

  21. void insertar(Lista *lista, int v) { pNodo nuevo, anterior; nuevo=(pNodo)malloc(sizeof(alumno)); nuevo->matricula=v; if (*lista==NULL) { nuevo->siguiente=NULL; *lista=nuevo; } else { anterior=*lista; while(anterior->siguiente) anterior=anterior->siguiente; nuevo->siguiente = anterior->siguiente; anterior->siguiente = nuevo; } } En la estructura creada se asigna al elemento matrícula el valor v

  22. void insertar(Lista *lista, int v) { pNodo nuevo, anterior; nuevo=(pNodo)malloc(sizeof(alumno)); nuevo->matricula=v; if (*lista==NULL) { nuevo->siguiente=NULL; *lista=nuevo; } else { anterior=*lista; while(anterior->siguiente) anterior=anterior->siguiente; nuevo->siguiente = anterior->siguiente; anterior->siguiente = nuevo; } } Se verifica si la lista esta vacía (o sea NULL) para comenzar la lista o de lo contrario insertar el elemento al final de la lista

  23. void insertar(Lista *lista, int v) { pNodo nuevo, anterior; nuevo=(pNodo)malloc(sizeof(alumno)); nuevo->matricula=v; if (*lista==NULL) { nuevo->siguiente=NULL; *lista=nuevo; } else { anterior=*lista; while(anterior->siguiente) anterior=anterior->siguiente; nuevo->siguiente = anterior->siguiente; anterior->siguiente = nuevo; } } En el caso de que sí esta vacía al elemento apuntador siguiente de la estructura se le asigna NULL ya que es el primer elemento de la lista y se asigna a *listala dirección asignada por malloc

  24. void insertar(Lista *lista, int v) { pNodo nuevo, anterior; nuevo=(pNodo)malloc(sizeof(alumno)); nuevo->matricula=v; if (*lista==NULL) { nuevo->siguiente=NULL; *lista=nuevo; } else { anterior=*lista; while(anterior->siguiente) anterior=anterior->siguiente; nuevo->siguiente = anterior->siguiente; anterior->siguiente = nuevo; } } En el caso de que sí esta vacía al elemento apuntador siguiente de la estructura se le asigna NULL ya que es el primer elemento de la lista y se asigna a *listala dirección asignada por malloc De lo contrario (ya hay elementos en la lista) se dá la dirección asignada por malloc al apuntador anterior . Se hace un ciclo donde se va recorriendo cada elemento hasta llegar al final de la lista y se asigna la dirección del nuevo elemento

  25. void insertar(Lista *lista, int v) { pNodo nuevo, anterior; nuevo=(pNodo)malloc(sizeof(alumno)); nuevo->matricula=v; if (*lista==NULL) { nuevo->siguiente=NULL; *lista=nuevo; } else { anterior=*lista; while(anterior->siguiente) anterior=anterior->siguiente; nuevo->siguiente = anterior->siguiente; anterior->siguiente = nuevo; } } Regresa el control al main ( )

  26. void main() { int i,n; clrscr(); printf("\n probando listas"); getch(); Lista lista=NULL; pNodo p; for (i=0;i<4;i++) { printf("\n dame la matricula del alumno %d",i+1); scanf("%d",&n); insertar(&lista,n); } MostrarLista(lista); getch(); } Manda el control a la función que despliega los nodos de la lista

  27. void MostrarLista(Lista lista) { pNodo nodo = lista; if(lista==NULL) printf("Lista vacía\n"); else { while(nodo!=NULL){ printf("%d ", nodo->matricula); nodo = nodo->siguiente; } printf("\n"); } } Del tipo pNodo crea un apuntador nodo y le asigna la dirección que le mandó como parámetro, la cual es el inicio de la lista

  28. void MostrarLista(Lista lista) { pNodo nodo = lista; if(lista==NULL) printf("Lista vacía\n"); else { while(nodo!=NULL){ printf("%d ", nodo->matricula); nodo = nodo->siguiente; } printf("\n"); } } Si la lista esta vacía, imprime el mensaje “Lista vacía”

  29. void MostrarLista(Lista lista) { pNodo nodo = lista; if(lista==NULL) printf("Lista vacía\n"); else { while(nodo!=NULL){ printf("%d ", nodo->matricula); nodo = nodo->siguiente; } printf("\n"); } } De lo contrario hace el ciclo mientras no se encuentre NULL, e imprime la matrícula de cada elemento. Se asigna la dirección del siguiente elemento de la lista a nodo

  30. void MostrarLista(Lista lista) { pNodo nodo = lista; if(lista==NULL) printf("Lista vacía\n"); else { while(nodo!=NULL){ printf("%d ", nodo->matricula); nodo = nodo->siguiente; } printf("\n"); } } Regresa el control al main ( )

  31. Ejemplificación de la inserción de nodos Primer Nodo de la Lista Matrícula • Siguiente • NULL

  32. Inserto otro nodo con la misma estructura Matrícula Matrícula • Siguiente • Siguiente • NULL

  33. Inserto otro nodo con la misma estructura Matrícula Matrícula Matrícula • Siguiente • Siguiente • Siguiente • NULL

  34. Inserto otro nodo con la misma estructura Matrícula Matrícula Matrícula Matrícula • Siguiente • Siguiente • Siguiente • Siguiente • NULL

  35. Para Borrar un nodo • Guardo la dirección *siguiente del nodo que deseo eliminar • Asigno la dirección *siguiente del nodo que deseo eliminar al nodo anterior al que deseo eliminar Matrícula Matrícula Matrícula Matrícula • Siguiente • Siguiente • Siguiente • Siguiente • NULL

  36. Para Borrar un nodo • Guardo la dirección *siguiente del nodo que deseo eliminar • Asigno la dirección *siguiente del nodo que deseo eliminar al nodo anterior al que deseo eliminar Matrícula Matrícula Matrícula Matrícula • Siguiente • Siguiente • Siguiente • Siguiente • NULL

  37. Para Borrar un nodo • Guardo la dirección *siguiente del nodo que deseo eliminar • Asigno la dirección *siguiente del nodo que deseo eliminar al nodo anterior al que deseo eliminar Matrícula Matrícula Matrícula Matrícula • Siguiente • Siguiente • Siguiente • Siguiente • NULL

  38. Para Borrar un nodo • Guardo la dirección *siguiente del nodo que deseo eliminar • Asigno la dirección *siguiente del nodo que deseo eliminar al nodo anterior al que deseo eliminar Matrícula Matrícula Matrícula Matrícula • Siguiente • Siguiente • Siguiente • Siguiente • NULL

  39. Para Borrar un nodo • Guardo la dirección *siguiente del nodo que deseo eliminar • Asigno la dirección *siguiente del nodo que deseo eliminar al nodo anterior al que deseo eliminar Matrícula Matrícula Matrícula Matrícula • Siguiente • Siguiente • Siguiente • Siguiente • NULL

More Related