elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / Listas generales en C en: 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:

Código
  1. typedef struct _GNodo {
  2. void *dato;
  3. struct _GNodo *sig;
  4. } 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
  1. #include "glist.h"
  2. #include <stdlib.h>
  3.  
  4. GList glist_crear() {
  5. return NULL;
  6. }
  7.  
  8. void glist_destruir(GList lista) {
  9. GList nodoAEliminar;
  10. while (lista != NULL) {
  11. nodoAEliminar = lista;
  12. lista = lista->sig;
  13. free (nodoAEliminar);
  14. }
  15. }
  16.  
  17. GList glist_agregar_inicio(GList lista, void* dato) {
  18. GList nuevoNodo = malloc (sizeof (GNodo));
  19. nuevoNodo->dato = dato;
  20. nuevoNodo->sig = lista;
  21. return nuevoNodo;
  22. }
  23.  
  24. GList glist_agregar_final (GList lista, void* dato) {
  25. GList nuevoNodo = malloc (sizeof (GNodo));
  26. nuevoNodo->dato = dato;
  27. nuevoNodo->sig = NULL;
  28. if (lista == NULL) {
  29. return nuevoNodo;
  30. }
  31. GList nodo = lista;
  32. for (; nodo->sig != NULL; nodo = nodo->sig);
  33. nodo->sig = nuevoNodo;
  34. return lista;
  35. }
  36.  
  37. void glist_recorrer (GList lista, FuncionVisitante visit) {
  38. for (GList nodo = lista; nodo != NULL; nodo=nodo->sig){
  39. visit (nodo->dato);
  40. }
  41. }
  42.  

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
  1. int main(){
  2. int a = 3;
  3. void *ptr;
  4. ptr = &a;
  5. printf ("%d", *((int*)ptr)); //convierto ptr a int* y lo desreferencio con *
  6. return 0;
  7. }
  8.  

Este es el main que tengo:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "glist.h"
  5.  
  6.  
  7. static void imprimir_entero(void* dato) {
  8.  printf("%d ", (*(int*)dato));
  9. }
  10.  
  11. int main(){
  12. int a = 3;
  13. char c = 'a';
  14. double d = 2.3;
  15. GList lista = glist_crear();
  16. lista = glist_agregar_inicio (lista, &a);
  17. lista = glist_agregar_inicio (lista, &c);
  18. lista = glist_agregar_inicio (lista, &d);
  19. lista = glist_agregar_final (lista, &a);
  20. printf ("%lf %c %d\n", (*(double*)lista->dato),(*(char*)lista->sig->dato),(*(int*)lista->sig->sig->sig->dato) );
  21. //~ printf ("\n %lf", (*(double*)(lista->dato)));
  22. glist_recorrer (lista, imprimir_entero);
  23. glist_destruir (lista);
  24. return 0;
  25. }
  26.  

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
  1. 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
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines