Добавлены комментарии, но мне кажется, что это имеет смысл?
ptr = (node*)malloc(sizeof(node));
ptr->info = 4;//what is this??
// 4 - это значение, которое вы вводите в этот узел
ptr2 = (node*)malloc(sizeof(node));
ptr->next = ptr2;
ptr2->next = NULL;
// ptr первыйэлемент в связанном списке, теперь ptr2 является вторым
ptr->next->info = 1;//5 1 <-actual list //what happened to 4??
// Присвоение значения ptr-> next, т. е. ptr2 - 4 не затрагивается в первом узле
printf("ptr2 %d\n",func1(ptr2));//1
// 1 имеет смысл, поскольку ptr2 является последним элементом в связанном списке
printf("ptr %d\n",func1(ptr));//5
// 5 имеет смысл, поскольку ptr является первым элементом
ptr3 = (node*)malloc(sizeof(node));//5 1 _
ptr3->next = ptr;//5 1 _ ? //but there's no space for ptr3->next??
// нет пробела?// ptr3 теперь является первым элементом в связанном списке
HTH!