Aqui esta el programa visto en clase modificado como creí conveniente para hacer una pila.
#include <stdio.h> // imprimir (printf) #include <stdlib.h> // reservar memoria #include "pilas.h" elem* borrar(elem* esto) { elem* temp; while (esto != NULL) { temp = esto->siguiente; free(esto); esto = temp; } return NULL; } bool buscar(int valor, elem* aqui) { if (aqui != NULL) { #ifdef DEBUG printf("Buscando por %d en %d.\n", valor, aqui->dato); #endif if (aqui->dato == valor) { #ifdef DEBUG printf("Son iguales.\n"); #endif return TRUE; } else if (aqui->dato > valor) { #ifdef DEBUG printf("Ya es mayor. No va a estar.\n"); #endif return FALSE; } return buscar(valor, aqui->siguiente); } else { #ifdef DEBUG printf("Ya se acabo. No estuvo.\n"); #endif return FALSE; // busqueda fallida } } bool eliminar_elemento(int valor, elem* aqui, elem** inicio) { if (aqui != NULL) { // si hay algo if (aqui->dato == valor) { // hay que borrar el elemento if (aqui->siguiente != NULL) { aqui->siguiente->anterior = aqui->anterior; } if (aqui->anterior == NULL) { *inicio = aqui->siguiente; } else { aqui->anterior->siguiente = aqui->siguiente; } free(aqui); // borrame return TRUE; // eliminacion exitosa } else if (aqui->dato > valor) { return FALSE; } return eliminar_elemento(valor, aqui->siguiente, inicio); } return FALSE; } // interface para llamadas mas bonitas bool eliminar(int valor, elem** inicio) { return eliminar_elemento(valor, *inicio, inicio); } void imprime_elemento(elem* esto) { // iterativa while (esto != NULL) { printf("%d ", esto->dato); esto = esto->siguiente; } return; } // interfase que agrega [ ... ] y el \n void imprimir(elem* lista) { printf("[ "); imprime_elemento(lista); printf("]\n"); return; } elem* agregar(int valor, elem* aqui) { elem* nuevo = NULL; if (aqui != NULL) { printf("Estoy en %d, insertando un %d.\n", aqui->dato, valor); } else { printf("No hay nada.\n"); } if (aqui == NULL) { // no hay nadie nuevo = (elem*)malloc(sizeof(elem)); nuevo->dato = valor; // asignar dato nuevo->siguiente = NULL; // el unico nuevo->anterior = NULL; // el unico return nuevo; } else { if (valor < aqui->dato) { nuevo = (elem*)malloc(sizeof(elem)); nuevo->dato = valor; // pon el valor // aqui es el primer elemento nuevo->siguiente = aqui; aqui->anterior = nuevo; nuevo->anterior = NULL; return nuevo; int pseudoaleatorio() { return ((rand() % (MAX - MIN + 1)) + MIN); }