Struct as argument

Afraid your problems are because of misunderstanding of some fundamental C programming ideas.. or even programming ideas.

I have the following struct:

struct key {
int board;
int value;
int type;
};

does not create a variable its a struct definition i.e how you want to group the data would advise you use..
form its more obvious for newbie..

typedef struct {
int board;
int value;
int type;
} key; // now it is obvious you have defined a new variable type but not the variable

key myKey; // now the variable mykey exist of type key

myKey.board = 9; // thats how to get to items inside notice the dot

Functions and why prototypes

They are historic but they are still important to the compile process they ensure that the compiler understands what parameters you are passing this is called semantics checking,

Take the sentance in English
I rode my horse across the English Channel. -- there's nothing wrong with this as English, so unless you know the English Channel is water it seems acceptable. Same argument for prototypes even if they are in same file..

They are sometines a pain for instance

void func1(void); // still need a prototype even though nothing in or out..

Happy Coding...