求解我的程序有什么问题

本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。
浙大PTA

函数接口定义:

void input();

输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。

裁判测试程序样例:

#include
#include
#include

struct stud_node {
int num;
char name[20];
int score;
struct stud_node *next;
};
struct stud_node *head, *tail;

void input();

int main()
{
struct stud_node *p;

head = tail = NULL;
input();
for ( p = head; p != NULL; p = p->next )
    printf("%d %s %d\n", p->num, p->name, p->score);

return 0;

}

/* 你的代码将被嵌在这里 */

以下是我的解答:
void input()
{
struct stud_node *p;
p = (struct stud_node *)malloc(sizeof(struct stud_node));
scanf("%d", &p->num);
while(p->num != 0)
{
scanf("%s %d", p->name, &p->score);
if(head==0)
{
head=p;
head->next=NULL;
}
tail=p;
p=(struct stud_node *)malloc(sizeof(struct stud_node));
p->next=NULL;
tail->next=p;
scanf("%d", &p->num);

}

}
我的样张
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
0 0
目标样张
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
为什么我会多输出0 0?

修改如下,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stud_node {
    int  num;
    char name[20];
    int  score;
    struct stud_node *next;
};
struct stud_node *head, *tail;
void input();
int main()
{
    struct stud_node *p;

    head = tail = NULL;
    input();
    for ( p = head; p != NULL; p = p->next )
         printf("%d %s %d\n", p->num, p->name, p->score);

    return 0;
}

/* 你的代码将被嵌在这里 */
//以下是我的解答:
void input()
{
    struct stud_node *p;
    //p = (struct stud_node *)malloc(sizeof(struct stud_node));
    //scanf("%d", &p->num);
    while (1)//while(p->num != 0)
    {
        p = (struct stud_node *)malloc(sizeof(struct stud_node));
        p->next = NULL;
        scanf("%d", &p->num);
        if (p->num == 0) {
            free(p);
            break;
        }
        scanf("%s %d", p->name, &p->score);
        if(head == NULL){
           head = p;
           //head->next = NULL;
        }
        else
           tail->next = p;
        tail = p;
    }
}

你最后输入的0值也被作为有效节点加入到链表了啊
你应该先输入一个整数值,如果不为0,再创建节点加入链表才行

输入的时候,值为0的num不是NULL,导致输出多出来
输出的时候改一下就行

img

for ( p = head; p != NULL&&p->num!=0; p = p->next )
        printf("%d %s %d\n", p->num, p->name, p->score);

你在输入时只写了当num不为0时的后续工作,忽略了当num=0时,只是你不再继续输入name和score,但num=0是你输入的数据已经被指针指向,仍然会被输出。
还有是当num=0是程序退出,你的好像没有这个。

代码编辑错误