> The functions will have different return types and different numbers of arguments.
You're going to have to have some kind of flag indicating the type, otherwise how will you cast it back to the right type to call it?
Code:
typedef struct fp {
enum { ONE, TWO } type;
union {
int (*one)(void);
void (*two)(int);
} fn;
struct fp *next;
} fp_list;
Your call list traversal would just have a switch/case to use the correct union member.
Code:
switch ( p->type ) {
case ONE: result = p->fn.one(); break;
case TWO: ....
}