
*****Listing 1*****


#include <stdio.h>
#include <stdlib.h>

/* structure type flag values */

#define TYPENONE   0	/* Not pointing at an object */
#define TYPECHAR   1	/* char */
#define TYPEINT    2	/* int */
#define TYPELONG   3	/* long */
#define TYPEDOUBLE 4	/* double */

struct node {
	struct node *pfwd;	/* forward ptr */
	struct node *pbwd;	/* backward ptr */
	void *pobject;		/* ptr to object */
	unsigned int objtype;	/* indicate object type */
};

main()
{
	char c = 'A';
	int i = 10;
	long int l = 123456;
	double d = 123.45;
	struct node *pnode;

	pnode = malloc(sizeof(struct node));

/* let's point to a double */

	pnode->pobject = &d;
	pnode->objtype = TYPEDOUBLE;
	pnode->pfwd = NULL;
	pnode->pbwd = NULL;

/* at a later point, let's process the object to which we point */

	switch (pnode->objtype) {

	case TYPECHAR:
		printf("char: %c\n", *(char *)pnode->pobject);
		break;

	case TYPEINT:
		printf("int: %d\n", *(int *)pnode->pobject);
		break;

	case TYPELONG:
		printf("long: %ld\n", *(long *)pnode->pobject);
		break;

	case TYPEDOUBLE:
		printf("double: %f\n", *(double *)pnode->pobject);
		break;

	case TYPENONE:
		printf("none:\n");
		break;
	}
}

The output generated by this program is:
double: 123.450000

