Ver Mensaje Individual
  #5 (permalink)  
Antiguo 11/03/2011, 12:48
Aemilius
 
Fecha de Ingreso: diciembre-2010
Mensajes: 20
Antigüedad: 13 años, 11 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.