Hola @diego moisset de espanes llevo dias buscando por toda la web en español e ingles metodos de usar pilas en C. Doy un sincero agradeciemiento por tu contenido, es el que mejor explica a detalle como y porque se usa cada función.
Cuando hacemos: struct nodo *reco=raiz; NO se esta creando un nodo. Solo se define un puntero y lo inicializamos con la dirección del primer nodo de la lista o a NULL si la lista esta vacia. Cuando eliminamos nodos vamos a utilizar la función free.
Hola Diego, que tal? Te hago una preguntita. Cuando vos creas la variable de registro de tipo puntero "struct nodo *reco = raiz" para liberar, por que directamente no utilizas la variable global raiz? por ejemplo: void liberar(){ struct nodo *borr; while(raiz != NULL){ borr = raiz; raiz = raiz->siguiente; free(borr); } } Gracias!!! Sos un genio loco, vengo aprendiendo una banda con tu curso
void liberar(){ struct nodo *borr; while(raiz != NULL){ free(raiz); raiz = raiz->siguiente; // Error porque liberamos previamente lo apuntado por raiz y luego no podemos acceder a 'siguiente' !!! } }
Muchas gracias por tu contenido, es de mucha calidad y ayuda. Pero tengo una duda, y es para liberar la pila, creas un nodo reco, pero no puedes hacer lo mismo utilizando directamente el raiz? Haces bor = raiz , raiz = raiz->sig y liberas el bor... no sería lo mismo?
@@diegomoissetdeespanes por cierto, me olvide comentarte, haciendo pruebas aquel día, si después del liberar queremos insertar de nuevo se genera un bug al compilar y queda en bucle infinito, y creo que es porque no liberas directamente la *raiz y liberas el puntero *reco, almenos yo si libero directamente raiz y inserto de nuevo y imprimo la lista me sale correctamente, en principio reco apunta a la dirección de raiz pero al hacerle free a reco me da que borramos esa dirección de memoria y perdemos el apuntado de raiz y al volver a llenar la pila se genera un error. Me cuesta entender porque pero pasa. Por eso decidí liberar raiz directamente y luego no tenia problema si llenaba de nuevo la pila. Un saludo.
Buenas, profesor! Una duda: cómo es posible que el Puntero Raiz, a pesar de que no tenga aún una dir. de memoria asignada, pueda almacenar "en una dir. de memoria" un valor como NULL? lo digo porq se antecedió un * al puntero para asignarle NULL.
#include #include #include int main() { //Se define una variable de tipo puntero. Puede almacenar //una dirección o el valor NULL (el cual representa que no tiene una dirección de memoria dicha variable) int *puntero; puntero=NULL; //Ahora reservamos espacio para almacenar un valor entero. La variable puntero pierde el valor NULL y se //guarda en su interior la dirección de memoria donde se almacena el entero. puntero = malloc(sizeof(int)); //Almacenamos un entero en lo apuntado por puntero. Diferenciar con puntero=NULL (en esto almacenamos en puntero un valor) *puntero=100; //Imprimimos el valor entero de lo apuntado por la variable puntero printf("valor2:%i ",*puntero); //Liberamos el espacio donde se almaceno el entero free(puntero); //Podemos asignar ahora un NULL nuevamente a puntero, para recordar que no apunta a un entero el puntero. puntero=NULL; getch(); }
Es más conveniente que se pase como parámetro, yo no lo hago por el momento para poder concentrarnos en las otras partes de los algoritmos. #include #include #include struct nodo { int info; struct nodo *sig; }; //variable global que apunta al primer nodo de la lista struct nodo *raiz=NULL; void insertar(int x,struct nodo **raiz) { struct nodo *nuevo; nuevo = malloc(sizeof(struct nodo)); nuevo->info = x; if (raiz == NULL) { *raiz = nuevo; nuevo->sig = NULL; } else { nuevo->sig = *raiz; *raiz = nuevo; } } void imprimir(struct nodo *raiz) { struct nodo *reco=raiz; printf("Lista completa. "); while (reco!=NULL) { printf("%i ",reco->info); reco=reco->sig; } printf(" "); } int extraer(struct nodo **raiz) { if (raiz != NULL) { int informacion = (*raiz)->info; struct nodo *bor = *raiz; *raiz = (*raiz)->sig; free(bor); return informacion; } else { return -1; } } void liberar(struct nodo **raiz) { struct nodo *reco = *raiz; struct nodo *bor; while (reco != NULL) { bor = reco; reco = reco->sig; free(bor); } } int main() { insertar(10,&raiz); insertar(40,&raiz); insertar(3,&raiz); imprimir(raiz); printf("Extraemos de la pila:%i ",extraer(&raiz)); //imprimir(raiz); liberar(&raiz); getch(); return 0; }
@@diegomoissetdeespanes es que ya lo intente pero no funciona o mas bien no quiere funcionar de esa manera lo tuve que declarar como global para que funcionara
hola buenos dias! queria consultarle si se podrian crear listas sin la utilizacion de la funcion malloc? yo programo microcontroladores, no se si en microcontroladores se podra dar uso de esa funcion malloc, lo que si en los microcontroladores se maneja la memoria eeprom, que deberia de ser similar al manejo de memoria que utiliza la funcion malloc, capaz que este tema deba de encararlo por ahi...