一个简单的C程序问题

typedef struct stu
{
char name[10];
int score;
struct stu *next;
}node;

node *creat() //创建链表函数
{
node *head=NULL,*p,*tail;//定义当前指针、头指针、尾指针
p=(node *)malloc(sizeof(node));//创建第一个结点
printf("input name and score :\n");
scanf("%s%d",p->name,p->score);//输入结点数据域的数据项
p->next=NULL;//并将指针域置为空
if(p->score!=-1)
head=tail=p;//将头指针和尾指针都指向第一个结点
while(p->score!=-1)
{
p=(node *)malloc(sizeof(node));//创建下一个新节点
printf("input name and score:\n");
scanf("%s%d",p->name,p->score);
p->next=NULL;
if(p->score!=-1)
{
tail->next=p;//将新节点插入表尾 【第一处】怎么和上一个结点链接的,将p赋给上一节点的指针域是什么意思呢?
tail=p;//更新尾指针【第二处】既然上面已经赋给过p的值了,这个又是为何呢 ?
}
}
return head;
}

其中有两个步骤不太懂 已注明 望高手解释下 谢谢啦 :)
第一处:当前链表尾节点是tail所指神敬节点啊,tail->next=p即薯瞎雹是将新加节点放在tail后
第二处:然后tail向后移也即第一处所加数帆节点变成现在链表的尾节点
这两步就可以不断添加节点到链表中