Trick 1

The trick is to have a linked list and using the offsetof to find the actual address of the struct.

Trick 2

And a struct containing a function accepting itself, which ensure that you can add new params in the sturct, without modifying rest of the code.