Il cast della malloc è solo una buona abitudine che mi deriva dal compilatore C++ (per cui è obbligatorio, al contrario del C).

Per il puntatore, nota che nel tuo codice avevi utilizzato direttamente link per la malloc (dato che era visibile) ma dovevi utilizzare l'argomento passato. E se vuoi modificare un argomento questo deve essere passato per puntatore. Quindi, un puntatore da modificare deve essere un doppio puntatore.