There's a few things worong with your typedef's. Assuming your using MSVC.
An easy way to declare the types you have here would be something like;
This typedef includes the _type {} type, *ptype; format which declares the type and the pointer to your custom type all at the same time. If you see down in hash_table, your are able to use pbucket *table, which eliminates the extra *** in your code and can help when doing dynamic allocation (help so mucah as to keep your head straight about what your allocating etc..). Your original typedef, if you look had typedef struct bucket {} bucket;, you need to at least modify one of the two "bucket" names you have there when you specify your typedef.
You also need to cast if your using C++ build settings, if using plain C you may not need the cast, so your malloc line would be (with the following typedef changes I made);
hash_table* ht = (phash_table) malloc(sizeof(hash_table)*101);
Either way, this snippet should work for you;
typedef struct _bucket {
char *key;
void *data;
_bucket *next;
} bucket, *pbucket;
typedef struct _hash_table {
size_t size;
pbucket *table;
}hash_table, *phash_table;