i was presented with this function which cuts the first half of a list

and returns the head

but when i compiled it .i get a bug

i cant see the idea in this code

how i cuts by half??

Code:

#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int value;
struct node *next;
}Node;
Node * what1(Node * source);
int main()
{
Node *p;
p=(Node *)malloc(sizeof(Node));
p->value=1;
p->next=(Node *)malloc(sizeof(Node));
p->next->value=2;
p->next->next=(Node *)malloc(sizeof(Node));
p->next->next->value=3;
p->next->next->next=(Node *)malloc(sizeof(Node));
p->next->next->next->value=4;
what1(p);
free(p);
return 0;
}
Node* what1(Node * source)
{
Node *fast,*slow,*temp;
if (source==NULL||source->next==NULL)
return source;
slow=fast=source;
do
{
temp=slow;
slow=slow->next;
fast=fast->next;
if(fast)
fast=fast->next;
free(temp);
}while(fast);
return slow;
}