void input()
{
struct stud_node *newp,*lp;
lp = (struct stud_node *)malloc(sizeof(struct stud_node));
head = lp;
tail = lp->next;
scanf("%d %s %d\n", &lp->num, &lp->name, &lp->score);
while(1)
{
newp = (struct stud_node *)malloc(sizeof(struct stud_node));
lp->next = newp;
tail = newp->next;
lp = newp;
scanf("%d", &newp->num);
if(newp->num == 0)
break;
scanf("%s%d", &newp->name, &newp->score);
}
}

{
struct stud_node* newp = NULL;
while (1)
{
newp = (struct stud_node*)malloc(sizeof(struct stud_node));
newp->next = NULL;
scanf("%d", &newp->num);
if (newp->num == 0) {
free(newp);
break;
}
scanf("%s %d", newp->name, &newp->score);
if (!head)
head = newp;
else
tail->next = newp;
tail = newp;
}
}
你这个tail有问题
while循环结束后,tail = lp就行了。
while中应该先输入学号,如果为0就break,然后才是新建节点,输入数据,加入链表。你这都加入完了,才判断,那最后一个节点是不需要的啊