新手刚学C 关于一个链表遍历的问题 求解

typedef struct student
{
    char name[20];
    char sno[20];
    int result;
    struct student* next;
};

void main(int argc, char* argv[])
{
    student *head=NULL,*p=NULL,*q=NULL;
    for(int i=0;i<10;i++)
    {
        if(p==NULL)
        {
            if((p=(student*)malloc(sizeof(student)))==NULL)
            {
                printf("内存申请错误");
                return;
            }
            p->next=NULL;
            printf("输入姓名:");
            scanf("%s",p->name);
            printf("输入成绩:");
            char temp[20];
            scanf("%s",temp);
            p->result=atoi(temp);
            if(p->result<0)
            {
                printf("程序结束\n");
                return;
            }
            printf("输入学号:");
            scanf("%s",p->sno);
            if(head==NULL)
            {
                head=p;
            }
            q=head;
            while(q!=NULL)
            {
                printf("姓名:%s,成绩:%d,学号:%s\n",q->name,q->result,q->sno);
                q=q->next;
            }
            p=p->next;
        }
    }
    printf("达到人数上限,程序结束");
}
如题,为什么在以下这一步遍历只能打印出头节点,其他非空的节点都遍历不到吗.
    while(q!=NULL)
                {
                    printf("姓名:%s,成绩:%d,学号:%s\n",q->name,q->result,q->sno);
                    q=q->next;
                }
最后编辑2007-01-13 16:36:43