本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。
浙大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,导致输出多出来
输出的时候改一下就行
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是程序退出,你的好像没有这个。
代码编辑错误