Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Lista generica con tipos de datos int, dobule, apuntador void

Estas en el tema de Lista generica con tipos de datos int, dobule, apuntador void en el foro de C/C++ en Foros del Web. Hola! :) Ya puse algo referente (http://www.forosdelweb.com/f96/tamano-datos-memoria-con-apuntador-void-893019/) Este problema es similar y es el siguiente: Implementar una lista ligada, que sus nodos puedan guardar enteros ...
  #1 (permalink)  
Antiguo 09/03/2011, 23:02
 
Fecha de Ingreso: marzo-2010
Ubicación: df
Mensajes: 58
Antigüedad: 14 años
Puntos: 5
Lista generica con tipos de datos int, dobule, apuntador void

Hola! :)

Ya puse algo referente (http://www.forosdelweb.com/f96/tamano-datos-memoria-con-apuntador-void-893019/)

Este problema es similar y es el siguiente:

Implementar una lista ligada, que sus nodos puedan guardar enteros o floating point. Además debe de implementar las funciones comunes de listas: agregarNodo, buscarNodo y demás.

Yo lo implementaria como sigue:

Código C:
Ver original
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3.  
  4. struct nodoEntero {
  5.     int* elemento;
  6.     char* tipo;
  7.     void* siguiente;};
  8.    
  9. typedef struct nodoEntero nodoEntero;
  10.  
  11. struct nodoDouble {
  12.     double* elemento;
  13.     char* tipo;
  14.     void* siguiente;};
  15.  
  16. typedef struct nodoDouble nodoDouble;
  17.  
  18. int main()
  19. {
  20.     int entero = 5;
  21.     double flotante = 1.2;
  22.         //Creamos un nodo
  23.     nodoEntero* nuevoEntero;
  24.     nuevoEntero =  malloc(sizeof(nodoEntero));
  25.     nuevoEntero->elemento = &entero;
  26.     nuevoEntero->tipo = "entero";
  27.     nuevoEntero->siguiente = NULL;
  28.  
  29.       //Creamos un nodo double
  30.     nodoDouble* nuevoDouble;
  31.     nuevoDouble =  malloc(sizeof(nodoDouble));
  32.     nuevoDouble->elemento = &flotante;
  33.     nuevoDouble->tipo = "flotante";
  34.     nuevoDouble->siguiente = nuevoEntero;
  35.    
  36.     nuevoDouble->siguiente; //esto regresa un apuntador
  37.     (nuevoDouble->siguiente)->elemento; //¿porque no puedo hacer esto?
  38. }

Saludos! :)
  #2 (permalink)  
Antiguo 10/03/2011, 14:40
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 18 años, 9 meses
Puntos: 9
Respuesta: Lista generica con tipos de datos int, dobule, apuntador void

LO TIENES QUE HACER CON C? O PUEDES IMPLEMTARLO CON C++, SI ES CON C++, PUEDES UTILIZAR TEMPLATES.

SI NO TE RECOMIENDO EN PRIMERA QUE CREES UNA ESTRUCTRA ASI

struct DATO
{
void *dato;
DATO* psig;
};

cada vez que vayas a almacenar un nuevo valor debes asignar memoria.
void main()
{
int *numero = (int*)malloc(sizeof(int));
DATO *dato = (DATO*)malloc(sizeof(DATO));
*numero= 1;
dato->dato = numero;

agregarNuevoElemento(dato);

numero=(int*)malloc(sizeof(int));
*numero = 2;
dato = (DATO*)malloc(sizeof(DATO));
dato->dato = numero;

agregarNuevoElemento(dato);
}


void agregarNuevoElemento(DATO *nuevo);
  #3 (permalink)  
Antiguo 10/03/2011, 22:55
 
Fecha de Ingreso: marzo-2010
Ubicación: df
Mensajes: 58
Antigüedad: 14 años
Puntos: 5
Respuesta: Lista generica con tipos de datos int, dobule, apuntador void

Hola! :)

Gracias por responder. Pero el codigo que me pusiste no responde mi duda ;(
  #4 (permalink)  
Antiguo 11/03/2011, 11:06
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 18 años, 9 meses
Puntos: 9
Respuesta: Lista generica con tipos de datos int, dobule, apuntador void

Lo que quieres es poder guardar cualquier tipo de dato en las listas, y quieres hacer usando c, la propuesta que te di te ayuda a poder almacer datos de cualquier tipo, o cual es tu proposito de tu lista?
  #5 (permalink)  
Antiguo 11/03/2011, 12:48
 
Fecha de Ingreso: diciembre-2010
Mensajes: 20
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Lista generica con tipos de datos int, dobule, apuntador void

Si quieres una lista que pueda almacenar cualquier tipo de dato entonces tienes que definir un dato con tipo variante, llamando simplemente "variante".

Teniendo un variante, es fácil de definir un nodo de la lista por que tendrá sólo dos elementos: el variante y un puntero al siguiente nodo de la lista.

De hecho ya existen varios variantes ya implementados que quizá te interese usar. De lo contrario puedes implementar el tuyo propio.

En el variante tienes que guardar dos elementos: el "tipo de dato" y el "dato/puntero al dato". El tipo de dato lo puedes almacenar en un entero, cada número representando un tipo de dato. El dato generalmente se guarda en un union:

http://msdn.microsoft.com/en-us/library/y9zewe0d%28v=vs.80%29.aspx

Union permite interpretar el mismo pedazo de memoria de distintas formas. En ese pedazo, generalmente de 8 bytes, puede entrar desde un char hasta un double pasando por un puntero de 32 o 64 bits. Asi que tu union incluirá interpretaciones para los tipos de datos comunes que ocupen hasta 8 bytes. Para otros tipos de datos bastará un puntero a void. Para interpretar el union tienes que echar mano del campo del variante que almacena el tipo de dato.

Si vas a guardar un puntero en el variante tienes que guardar detalles del tipo al que apunta. Por ejemplo tienes que diferenciar entre "char", "puntero a char (referencia)" y "puntero a char (valor: memoria apuntada es responsabilidad de la lista)"*.

* Usando punteros podemos guardar referencias o "valores" en la lista. Una referencia implica que no tenemos responsabilidad de reservar ni liberar memoria, pero nos tienen que garantizar que el puntero agregado a la lista será válido desde que es agregado a la lista hasta que es removido de la misma. Si agregamos el elemento por valor entonces debemos reservar memoria, copiar los datos apuntados y guardar la dirección de memoria reservada en el puntero guardado en la lista. Al remover el nodo debemos liberar esa memoria. Si guardamos un elemento por valor ya no necesitamos que nos garanticen que el otro puntero será válido después de que el nodo es agregado.
  #6 (permalink)  
Antiguo 23/03/2011, 19:30
 
Fecha de Ingreso: marzo-2010
Ubicación: df
Mensajes: 58
Antigüedad: 14 años
Puntos: 5
Respuesta: Lista generica con tipos de datos int, dobule, apuntador void

Gracias a todos! pero desafortunadamente no solucionan completamente mis inquietudes.

En java puedo hacer una interfaz nodo la cual tenga el metodo getType. De este modo, haría que mis nodos implementaran esta interfaz. Así podría siempre conseguir su tipo de dato y hacer el cast correcto al apuntador void.

Saludos!
  #7 (permalink)  
Antiguo 23/03/2011, 23:29
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 18 años, 9 meses
Puntos: 9
Respuesta: Lista generica con tipos de datos int, dobule, apuntador void

C/C++ trabaja a mas bajo nivel que java. Para hacer lo que quieres puedes utilizar templates

http://www.cplusplus.com/doc/tutorial/templates/
  #8 (permalink)  
Antiguo 25/03/2011, 21:16
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 1 mes
Puntos: 260
Sonrisa Respuesta: Lista generica con tipos de datos int, dobule, apuntador void

Hola,

Cita:
Iniciado por pollin14 Ver Mensaje
... En java puedo hacer una interfaz nodo la cual tenga el metodo getType. De este modo, haría que mis nodos implementaran esta interfaz. Así podría siempre conseguir su tipo de dato y hacer el cast correcto al apuntador void. ...
En Java no existe el tipo de datos void, pero si existe el tipo de datos Object del cual desciende toda la jerarquía de clases. Así que cualquier clase siempre desciende de Object, lo cual lo convierte en un lenguaje bastante genérico en si mismo.

Cita:
Iniciado por dragg04 Ver Mensaje
C/C++ trabaja a mas bajo nivel que java. Para hacer lo que quieres puedes utilizar templates

http://www.cplusplus.com/doc/tutorial/templates/
En Java se llaman Generics, pero tienen la capacidad de manejar cualquier tipo de datos con la especialización data<?>. En C++ puedes manejar Templates que encapsulen los tipos de datos básicos new int(5), new float(5.5f), etc.


Pero C es otro lenguaje muy diferente, no mezcles un lenguaje orientado a objetos como C++ o Java con uno que no lo es.

Saludos,
  #9 (permalink)  
Antiguo 25/03/2011, 21:47
 
Fecha de Ingreso: marzo-2010
Ubicación: df
Mensajes: 58
Antigüedad: 14 años
Puntos: 5
Respuesta: Lista generica con tipos de datos int, dobule, apuntador void

Hola! :)

Muchas gracias por responder e intentar ayudarme.

Ahora, Estoy llevando la materia Arquitectura de Computadoras, en la cual estamos programando el procesador MIPS( assembly ) además de programar en C, que por lo que dijo dragg04, sera para entender mejor el funcionamiento de la computadora.

¿porque me pidieron este tipo de listas? no se. Lo unico que se me occurre es aprender a usar C por cultura general.

Esto de las listas fue la primera practica en C y la unica relación clara que le veo con el hardware son los apuntadores (operadores asterisco y ampersand) .

Gracias otra vez! :)
  #10 (permalink)  
Antiguo 28/03/2011, 01:03
 
Fecha de Ingreso: julio-2010
Mensajes: 153
Antigüedad: 13 años, 8 meses
Puntos: 1
Respuesta: Lista generica con tipos de datos int, dobule, apuntador void

lo que pasa es que aún te falta conocer mucho, pero puedes estar seguro que saber c es por mucho mas que cultura general, todos los sistemas operativos que conoscas estan hechos en c/asm, ¿por que c? , solo una pequeñizmia parte dependiente de hardware la haces en asm y lo de mas en c, así aseguras la portabilidad

y ese tipo de listas se usan en muchos tipos de algoritmos diferentes y son muy utiles

Etiquetas: apuntador, dobule, generica, lista, void, tipo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:27.