¡Claro! Podrías poner un puntero void * que guarde datos genéricos, e incluso hacer que la función haga una copia de esos datos para que así hacer que el que programa no tenga que preocuparse por liberar o no la memoria almacenada en la pila!
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes Menú#include <stdlib.h>
#include <stdio.h>
// Para generalizar, uso un tipo de datos predefinido, así puedo
// cambiar entre int y el tipo de datos que quiera
typedef int tipo;
typedef struct ElementoLista{
tipo dato;
struct ElementoLista *siguiente;
} Elemento;
// En la estructura de una pila, solo necesitamos la referencia al
// último elemento agregado
typedef struct {
Elemento *ultimo;
unsigned int num_elementos;
} Pila;
// Pero en la estructura de una cola, también necesitaremos la
// referencia del primer elemento
typedef struct {
Elemento *primero;
Elemento *ultimo;
unsigned int num_elementos;
} Cola;
// Si alguna de estas dos funciones retorna 0, significa que
// ha ocurrido un error, de lo contrario, retornará un valor
// diferente de 0
int agregar_a_pila(Pila *pila, tipo dato);
int agregar_a_cola(Cola *cola, tipo dato);
// Destruye el último elemento y retorna los datos almacenados en el
tipo quitar_a_pila(Pila *pila);
tipo quitar_a_cola(Cola *cola);
// Para demostrar el uso de 'quitar_a_pila' y 'quitar_a_cola'
// estas funciones destruyen la pila y la cola respectivamente
// al mostrarlas
void mostrar_pila(Pila *pila);
void mostrar_cola(Cola *cola);
int main() {
// No hay que olvidarse de inicializar, porque si no,
// no hay manera de determinar si un puntero a memoria
// dinámica es válido o no...
Pila pila = {NULL, 0};
Cola cola = {NULL, NULL, 0};
tipo dato;
// Para probar que todo funciona perfectamente, hacemos que el
// usuario introduzca enteros para almacenarlos tanto en una cola
// como en una pila.
fprintf(stdout, "Introduzca una serie de numeros (0 para acabar): ");
fscanf(stdin, "%d", &dato);
while(0 != dato) {
agregar_a_pila(&pila, dato);
agregar_a_cola(&cola, dato);
fscanf(stdin, "%d", &dato);
}
// Mostramos la pila y la cola (destruyendo a su vez los datos
// de las mismas)
mostrar_pila(&pila);
fputc('\n', stdout);
mostrar_cola(&cola);
return 0;
}
int agregar_a_pila(Pila *pila, tipo dato) {
Elemento *elemento;
// Creamos elemento y guardamos datos...
elemento = malloc(sizeof(Elemento));
if(NULL == elemento)
return 0;
elemento->dato = dato;
// Reconfiguramos pila...
if(NULL == pila->ultimo) {
elemento->siguiente = NULL;
pila->num_elementos = 1;
pila->ultimo = elemento;
} else {
elemento->siguiente = pila->ultimo;
pila->num_elementos += 1;
pila->ultimo = elemento;
}
return 1;
}
int agregar_a_cola(Cola *cola, tipo dato) {
Elemento *elemento;
// Creamos elemento y guardamos datos...
elemento = malloc(sizeof(Elemento));
if(NULL == elemento)
return 0;
elemento->dato = dato;
elemento->siguiente = NULL;
// Reconfiguramos cola...
if(NULL == cola->primero) {
cola->num_elementos = 1;
cola->primero = elemento;
cola->ultimo = elemento;
} else {
cola->ultimo->siguiente = elemento;
cola->num_elementos += 1;
cola->ultimo = elemento;
}
return 1;
}
tipo quitar_a_pila(Pila *pila) {
Elemento *temp;
tipo dato;
if(NULL != pila->ultimo) {
dato = pila->ultimo->dato;
temp = pila->ultimo;
pila->ultimo = pila->ultimo->siguiente;
pila->num_elementos -= 1;
free(temp);
} else {
dato = -1;
}
return dato;
}
tipo quitar_a_cola(Cola *cola) {
Elemento *temp;
tipo dato;
// Hacemos esta asignación, porque si el primer elemento de la cola y
// el último son iguales, destruiremos el primer elemento, dejando al último
// sin memoria asignada, por lo que directamente al último elemento le
// asignamos NULL para que no haya errores
if(cola->primero == cola->ultimo)
cola->ultimo = NULL;
if(NULL != cola->primero) {
dato = cola->primero->dato;
temp = cola->primero;
cola->primero = cola->primero->siguiente;
cola->num_elementos -= 1;
free(temp);
} else {
dato = -1;
}
return dato;
}
void mostrar_pila(Pila *pila) {
tipo dato;
while(NULL != pila->ultimo) {
dato = quitar_a_pila(pila);
fprintf(stdout, "%d ", dato);
}
}
void mostrar_cola(Cola *cola) {
tipo dato;
while(NULL != cola->primero) {
dato = quitar_a_cola(cola);
fprintf(stdout, "%d ", dato);
}
}
Elemento *temp = inicio;
inicio = inicio->siguiente;
free(temp);
Cita de: NOB2014 en 21 Agosto 2016, 23:29 PM
estoy desconcertado con esto, yo había intentado unas cuantas veces y siempre seguía en el bucle si el ingreso era mayor que el permitido por INT_MAX, ahora resulta que en ciertos casos también me falla y pone un número distinto al ingresado y sale del bucle, debo suponer que esto no tiene solución, soy muy exigente con las validaciones de ingreso de datos. -
Cita de: NOB2014No estoy de acuerdo, si se ingresa un dato mayor a INT_MAX no se sale del bucle, en cambio, si no pongo esta condición el compilador lo transforma a un número negativo o algo por el estilo, no recuerdo.
typedef struct ElementoLista{
int dato;
struct ElementoLista *siguiente;
} Elemento;
typedef struct {
Elemento *ultimo;
unsigned int num_elementos;
} Pila;
typedef struct {
Elemento *primero;
unsigned int num_elementos;
} Cola;
// Si se retorna 0 por alguna de las dos funciones siguientes, ha habido error. De lo contrario, todo ha ido correctamente
int agregar_a_pila(pila *pila);
int agregar_a_cola(cola *cola);
int quitar_a_pila(pila *pila);
int quitar_a_cola(cola *cola);
void mostrar_pila(const pila *pila);
void mostrar_cola(const cola *cola);
ok = scanf( "%d", &dto ) == 1 && dto >0 && dto <= INT_MAX;