一个链表的创建有关问题,不带头节点从头插入

一个链表的创建问题,不带头节点从头插入
#include <stdio.h>
#include <malloc.h> 
typedef struct node{
int date;
struct node *next;
}NODE;

NODE *creat_list();
void insert_list(NODE *head,int pos,int val);
void delete_list(NODE *head,int pos);
void display_list(NODE *head); 

int main(int argc, char *argv[])
{
NODE *head;
int pos, val;

head=creat_list();
//insert_list(head,pos,val);
display_list(head); 
//delete_list(head,pos);
return 0;
}

NODE *creat_list()
{
NODE *head=NULL,*p,*ph;
int len; 
int i; 
int date; 

printf("请输入数据的长度:"); 
scanf("%d",&len);

for(i=0;i<len;i++)
{
p=(NODE *)malloc(sizeof(NODE)); 

printf("请输入数据:");
scanf("%d",&date); 
p->date=date;

if(NULL == head)

head=p;
p->next=NULL;

else 
{
ph->next=p;
head=ph; 
}
ph=p; 
}
return head; 
}

void display_list(NODE *head)
{
NODE *p=head;

while(NULL!=p)
{
printf("%d\n",p->date);
p=p->next; 

}

------解决方案--------------------
#include <stdio.h>
#include <malloc.h>
typedef struct node{
int date;
struct node *next;
}NODE;

NODE *creat_list();
void insert_list(NODE *head,int pos,int val);
void delete_list(NODE *head,int pos);
void display_list(NODE *head);

int main(int argc, char *argv[])
{
NODE *head;
//int pos, val;

head=creat_list();
//insert_list(head,pos,val);
display_list(head);
//delete_list(head,pos);
return 0;
}

NODE *creat_list()
{
NODE *head=NULL,*p;
int len;
int i;
int date;

printf("请输入数据的长度:");
scanf("%d",&len);

for(i=0;i<len;i++)
{
p=(NODE *)malloc(sizeof(NODE));

printf("请输入数据:");
scanf("%d",&date);
p->date=date;

if(NULL == head)
{
head=p;
p->next=NULL;
}
else
{
p->next=head->next;
head->next=p;
}

  
}
return head;
}

void display_list(NODE *head)
{
NODE *p=head;

while(NULL!=p)
{
printf("%d\n",p->date);
p=p->next;
}


能输出,但乱序,我就不知道什么原因了
------解决方案--------------------
探讨
#include <stdio.h>
#include <malloc.h>
typedef struct node{
int date;
struct node *next;
}NODE;

NODE *creat_list();
void insert_list(NODE *head,int pos,int val);
void delete_list(NODE *hea……