本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。
函数接口定义:
void input();
该函数利用scanf
从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:
struct stud_node {
int num; /*学号*/
char name[20]; /*姓名*/
int score; /*成绩*/
struct stud_node *next; /*指向下个结点的指针*/
};
单向链表的头尾指针保存在全局变量head
和tail
中。
输入为若干个学生的信息(学号、姓名、成绩),当输入学号为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;
}
/* 你的代码将被嵌在这里 */
输入样例:
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
0
输出样例:
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
17分,没有考虑输入为0的情况,而且比较浪费空间
void input()
{
struct stud_node *p,*q;
//先存第一个结点的数据
q=(struct stud_node *)malloc(sizeof(struct stud_node));
scanf("%d%s%d",&q->num,q->name,&q->score);
//判断表是否为空,为空则让头指针为空
if(q->num==0)
{
head=NULL;
}
head=q;//头指针指向第一个结点,指向q这个链表
while(1)//while(1) 是一个无限循环的语句,它会一直执行下去,直到遇到 break 语句或者程序被强制终止。
{
p=(struct stud_node*)malloc(sizeof(struct stud_node));
scanf("%d",&p->num);
//判断输入是否结束,结束则指向空,并结束循环
if(p->num==0)
{
q->next=NULL;
break;
}
//继续输入结点数据
scanf("%s %d",p->name,&p->score);
//连接q结点和p结点
q->next=p;
//循环上述操作
q=p;
}
q->next=NULL;//不浪费内存
}
标椎答案 ,使用尾插法。
void input()
{
struct stud_node* node;//先定义一个指针,指向node节点
node = (struct stud_node*)malloc(sizeof(struct stud_node));
//开辟节点空间
scanf("%d", &node->num);
//先输入第一个节点的学号
while (node->num != 0)
{
scanf("%s%d", &node->name, &node->score);
//再输入该节点的姓名,分数
if (tail == NULL)//第一个节点的情况,此时链表为空表
//头节点与尾节点都为空
{
head = node;//使node节点成为头节点同时也是尾节点
//因为只有一个节点
head->next = NULL;//尾节点指向的下一个指针为NULL
}
if (tail != NULL)tail->next = node;//第2,3...n个节点的情况
//此时使用尾插法,在节点1前插入一个节点2
tail = node;//再把尾指针往后遍历一位,尾节点从节点1变成节点2
tail->next = NULL;
node = (struct stud_node*)malloc(sizeof(struct stud_node));
//为新节点开辟空间
scanf("%d", &node->num);
}
}
自己的理解
void input()
{
struct stud_node *node;//存储结点
node=(struct stud_node *)malloc(sizeof(struct stud_node));
scanf("%d",&node->num);//输入第一个结点
//结束条件输入为0,没有学生的情况
while(node->num!=0)
{
scanf("%s%d",node->name,&node->score);//满足条件则输入学生情况
//当尾结点为空,说明是输入第一个结点的情况
if(tail==NULL)
{
head=node;//头结点=node结点,说明head表与node表相同,现在只需用tail把其他结点连接起来
head->next=NULL;//2个结点的指针指向空
}
//第2,3...n个节点的情况,移动指针指向存储结点
if(tail!=NULL)
tail->next=node;
//只有第一个结点的时候,头结点=存储结点=尾指针=移动结点
//第2,3...n个节点的情况,移动结点变为存储结点
tail=node;
//移动结点=存储结点的指针指向空
tail->next=NULL;
//为新节点开辟空间
node=(struct stud_node *)malloc(sizeof(struct stud_node));
scanf("%d", &node->num);
}
}