这题主要考察链表的知识,比较基础,没有涉及插入比较排序之类的问题,但是这题还是有几个坑,我无一例外都踩上去了,导致浪费了很多时间。
Problem F: 查询成绩(要求用链表完成)
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 1140 Solved: 102
Description
知道如何创建链表了。
本题继续要求用链表完成。输入同学成成绩后,现在再输入1个同学的姓名,输出该同学的成绩。
Input
输入一些学生的信息,每个学生信息一行,分别为学号、姓名和成绩,中间用空格隔开,其中学号和成绩均为整数,姓名为不超过15个仅包含大小写字母的字符。
如果输入的一行是非正整数时,表示结束
在成绩结束后,输入一行,为一个同学的姓名
Output
输出一个整数,表示该同学的成绩
Sample Input
1001 xiangwang 90
1002 xiaoli 85
1003 xiaohong 97
1004 xiaoma 76
-1
xiaoli
Sample Output
85
几个坑:
1.需要利用尾结点添加数据(这样能够节省时间,题目有时间限制)
2.不能用cin输入数据(从网上查得cin比scanf慢10倍左右,题目有时间限制)
代码如下:
#include<bits/stdc++.h>
using namespace std;
struct Student
{
char name[20]; //姓名
int num; //所得票数
int score;
Student *next;
};
void seek(char name[20],struct Student *head) //查找功能
{
struct Student *p=head;
while(strcmp(p->name,name)!=0)
{
p=p->next;
}
cout<<p->score<<endl;
}
int main()
{
int num;
struct Student *head=NULL,*last=NULL;
struct Student *p;
while(1) //这里我将添加节点写在main函数中,但这不是一个好习惯,不推荐!
{
scanf("%d",&num);
if(num<=0) break;
char name[20];
int score;
scanf("%s",name);
scanf("%d",&score);
p=new Student;
strcpy(p->name,name);
p->num=num;
p->score=score;
p->next=NULL;
if(head==NULL)
{
head=p;
last=head;
}
else
{
last->next=p;
last=p;
}
}
char name[20];
scanf("%s",name);
seek(name,head);
}