Hola, estoy tratando de resolver un problema que se me pide con listas. Debo usar listas siguiendo la sig estructura:
Tengo 3 archivos, el glist.h, glist.c, y main_g.c. Las funciones que tengo son las basicas, que me permiten crear, destruir, agregar final, agregar inicio, y recorrer.
El problema que estoy teniendo, es que ahora no estoy trabajando con listas donde el dato es un int, estoy trabajando con listas donde el dato es un puntero a void. Yo se que el puntero a void puede apuntar a cualquier tipo de dato, pero para poder desreferenciarlo tengo que aplicar el cast correspondiente al tipo de dato que guarda.
Este es el main que tengo:
Como podria hacer para poder saber cual es el tipo de dato al que apunta void. Como podria hacer lo que esta en la linea 20
de forma general con la funcion imprimir_entero. El primer caso seria con un entero, un double y un char o cadena. Gracias
Código (c) [Seleccionar]
typedef struct _GNodo {
void *dato;
struct _GNodo *sig;
} GNodo;
Tengo 3 archivos, el glist.h, glist.c, y main_g.c. Las funciones que tengo son las basicas, que me permiten crear, destruir, agregar final, agregar inicio, y recorrer.
Código (c) [Seleccionar]
#include "glist.h"
#include <stdlib.h>
GList glist_crear() {
return NULL;
}
void glist_destruir(GList lista) {
GList nodoAEliminar;
while (lista != NULL) {
nodoAEliminar = lista;
lista = lista->sig;
free (nodoAEliminar);
}
}
GList glist_agregar_inicio(GList lista, void* dato) {
GList nuevoNodo = malloc (sizeof (GNodo));
nuevoNodo->dato = dato;
nuevoNodo->sig = lista;
return nuevoNodo;
}
GList glist_agregar_final (GList lista, void* dato) {
GList nuevoNodo = malloc (sizeof (GNodo));
nuevoNodo->dato = dato;
nuevoNodo->sig = NULL;
if (lista == NULL) {
return nuevoNodo;
}
GList nodo = lista;
for (; nodo->sig != NULL; nodo = nodo->sig);
nodo->sig = nuevoNodo;
return lista;
}
void glist_recorrer (GList lista, FuncionVisitante visit) {
for (GList nodo = lista; nodo != NULL; nodo=nodo->sig){
visit (nodo->dato);
}
}
El problema que estoy teniendo, es que ahora no estoy trabajando con listas donde el dato es un int, estoy trabajando con listas donde el dato es un puntero a void. Yo se que el puntero a void puede apuntar a cualquier tipo de dato, pero para poder desreferenciarlo tengo que aplicar el cast correspondiente al tipo de dato que guarda.
Código (c) [Seleccionar]
int main(){
int a = 3;
void *ptr;
ptr = &a;
printf ("%d", *((int*)ptr)); //convierto ptr a int* y lo desreferencio con *
return 0;
}
Este es el main que tengo:
Código (c) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "glist.h"
static void imprimir_entero(void* dato) {
printf("%d ", (*(int*)dato));
}
int main(){
int a = 3;
char c = 'a';
double d = 2.3;
GList lista = glist_crear();
lista = glist_agregar_inicio (lista, &a);
lista = glist_agregar_inicio (lista, &c);
lista = glist_agregar_inicio (lista, &d);
lista = glist_agregar_final (lista, &a);
printf ("%lf %c %d\n", (*(double*)lista->dato),(*(char*)lista->sig->dato),(*(int*)lista->sig->sig->sig->dato) );
//~ printf ("\n %lf", (*(double*)(lista->dato)));
glist_recorrer (lista, imprimir_entero);
glist_destruir (lista);
return 0;
}
Como podria hacer para poder saber cual es el tipo de dato al que apunta void. Como podria hacer lo que esta en la linea 20
Código (c) [Seleccionar]
printf ("%lf %c %d\n", (*(double*)lista->dato),(*(char*)lista->sig->dato),(*(int*)lista->sig->sig->sig->dato) );
de forma general con la funcion imprimir_entero. El primer caso seria con un entero, un double y un char o cadena. Gracias