Либо верните обновленный указатель головы, и используйте его как:
struct Domino* list = NULL;
list = add_domino(list, 1, 2);
Или передайте указатель на указатель и используйте его следующим образом:
struct Domino* list = NULL;
add_domino(&list, 1, 2);
Кроме того, ваша функция не обрабатывает недостаток памяти.
Далее, предпочитайте sizeof *pointer
, а не sizeof(TYPE)
, так как повторение подвержено ошибкам, особенно если компилятор не проверяет несовпадения.
И, наконец, рассмотрите возможность добавления в начало вместо хвоста, чтобы избежать многократного обхода всего списка. Обращение списка в конце, если это необходимо, является операцией с постоянным пробелом O (n).