链表的排序(结点) 为什么第一行不参与排序?解决办法

链表的排序(结点) 为什么第一行不参与排序??
C/C++ code
/* Note:Your choice is C IDE 同学通讯录*/
#include "stdio.h"
#include<stdlib.h>
#include<string.h>

struct stu
{
    long num;  //学号
    char name[20]; //姓名
    char sex;     //性别
    long phone; //电话号码
    struct stu *next;
};

struct stu *creat_list() // 建立链表
{
    struct stu *head,*q,*p;
    int i;
    for(i=0;i<3;i++)
    {
        q=(struct stu *)malloc(sizeof(struct stu));
        printf("请输入第%d个待处理数据:\n学号 姓名 性别 电话 (中间空格隔开)\n",i+1);
        scanf("%ld %s %c %ld",&q->num,&q->name,&q->sex,&q->phone);
        
        if(i==0)
           p=head=q;
        else
           {
                 p->next=q;
                 p=q;
           }
           
    }
    p->next=NULL;
    return head;
}

void print(struct stu *head)  //输出链表  
{
    struct stu *p;
    int i;
    p=head;
    printf("序号\t学号\t\t姓名\t\t性别\t\t电话\n");
    for(i=0;p!=NULL;i++)
    {
        printf("%d\t%ld\t\t%s\t\t%c\t\t%ld\n",i+1,p->num,p->name,p->sex,p->phone);
        p=p->next;
    }
}

struct stu *paixu(struct stu *head) //链表的排序
{
    struct stu *pra,*pa,*prb,*pb;
    pra=head;
    pa=pra->next;
    while(pa!=NULL)
    {
        prb=pa;
        pb=prb->next;
        while(pb!=NULL)
        {
            if(pb->num<pa->num)
            {
                prb->next=pb->next;
                pb->next=pa;
                pra->next=pb;
                pa=pb;
                pb=prb->next;
                continue;
            }
            prb=pb;
            pb=pb->next;
        }
        pra=pa;
        pa=pa->next;
    }
    return head;
}

main()
{
    struct stu *student;
    
    student=creat_list();
    printf("输出链表\n");
    print(student);
    
    
    student=paixu(student);
    printf("排序结果\n");
    print(student);
}

1》链表的冒泡排序,结点的交换,为什么排序时 第一行数据不参与排序??要如何更改呢?

2》输入电话号码时, 因为电话号码是11位数的,在类型为long 时 ,输入11位数
时是不是溢出了,而输出不是想要的结果,又该如何改呢? 还有那段排序代码怎样理解?
谢谢各位大牛了!


------解决方案--------------------
参考这里,我写的单链表插入排序:
http://blog.****.net/dizuo/archive/2011/06/05/6527148.aspx