struct A{
int info;
struct A *next;
};
void f(struct A **s, int i)
{
struct A *el;
el = (struct A*)malloc(sizeof(struct A));
el->info = i;
el->next = *s;
*s=el;
} *s = el.s будет передаваться указатель на поле next предыдущего элемента. (Другими словами, вставка элемента в середину списка - это ни что иное, что вставка элемента в начало правого подсписка, начинающегося в точке вставки.)malloc и не пользуется очевидной возможностью выполнить инициализацию переменной el (вместо присваивания).