If you didn't want to have a bad-pseudo-polymorphism then you would have to make a node for every data type you use. That will also need more code. Then you will have functions for every type. You would probably copy-paste a lot of things and get again bugs and lose time.
What McGyver suggested as an idea is better. But practically it might be worse. Your program will know what data types it uses. But what if you want to change the main program? You will have to change everything that has to do with types (though you could find-replace easily). And it would have more code, since it will have all the castings.
Having the casting and type decision in separate functions would make the main program more readable. For example:
You would make a function anyway to printf what you want. So why not do everything you want in the function and save code from the main program?
#define T1 long double
#define T2 int
if (strcmp("T1", float) == 0)
else (strcmp("T1", int) == 0)
then the same for T2, probably for T3
Though, everything depends on what you want
If you didn't then you would have to change everything in the main program. Bugs...