Блочок добавления в серёдку/конец надо доработать....
Во внутреннем if надо break поставить, а то он будет один элемент перед всеми добавлять...

ну а вывод... Не знаю, с самым сложным справились, а вывод не можете?
Код

while(h)
{
printf("%d\n",h->data);
h=h->next;
}

Как-то так))