Menú

Mostrar Mensajes

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ú

Temas - Fedex15

#1
Programación C/C++ / Listas generales en C
21 Abril 2017, 00:25 AM
Hola, estoy tratando de resolver un problema que se me pide con listas. Debo usar listas siguiendo la sig estructura:


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.


#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.


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:


#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

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