初学者提问:链表相关问题

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
    int data;**_//数据域_**_
    struct Node *pNext;**_//指针域_**

}Node,*pNode;**_//Node等价与 struct Node,pNode等价与 struct Node* _**
pNode create_list(void)**_;//该函数功能是创建一个非循环单链表,并将该链表的头结点的地址发生给phead_**  
 void traverse_list(pNode phead);**_//该函数功能是将一个链表进行便历 _**
int main(void)
{
    pNode phead =NULL;**_//等价于 struct Node* phead=NULL; _**
       phead=create_list();
       traverse_list(phead);
    return 0;
}
pNode create_list(void)
{
    int length;**_//链表的长度 _**
    int val;**_//用来存放用户临时存入结点的值 _**
    int i;
    pNode phead=(pNode)malloc(sizeof(Node));**_//分配了一不存放有效数据的头结点 _**
    if(NULL==phead)
    {
        printf("分配内存失败,程序终止!\n");
        exit(-1);
    }
    pNode pTail=phead;**_//分配了一个尾结点_** 
    pTail->pNext=NULL; 
    printf("请输入您需要生成链表结点的个数:length=");
    scanf("%d",&length);
    for(i=0;i<length;++i)
    {
        printf("请输入第%d个结点数据:",i+1);
        scanf("&d",&val);
        pNode pNew=(pNode)malloc(sizeof(Node)); 
    if(NULL==pNew)
    {
        printf("分配内存失败,程序终止!\n");
        exit(-1);
    }
     printf("\n");
    pNew->data=val;**_//给新结点的数据域赋值 _**
    pTail->pNext=pNew;**_//将尾结点指向新结点 _**
    pNew->pNext=NULL;**_//将新结点的指针域清空 _**
    pTail=pNew;**_//将新结点变为尾结点 _**
    }
    return phead;
 }  
  void traverse_list(pNode phead)

  {
    pNode p=phead->pNext;
    while(NULL!=p)
      {
        printf("%d\n",p->data);
        p=p->pNext;
       } 
       printf("\n");
       return;
  }



为什么会出现这样的情况?
图片说明

有笔误
scanf("&d",&val);
改一下就正常了
scanf("%d", &val);