若干个学生信息(包括学号、姓名和成绩),输入学号为0时输入结束,建立一个单向链表,再输入一个成绩值,将成绩大于等于该值的学生信息输出。
提示:
定义函数struct stud_node *Creat_Stu_Doc()完成创建链表
定义函数struct stud_node DeleteDoc(struct stud_node head,int min_score)将分数低于min_score的结点删除
定义函数void Ptrint_Stu_Doc(struct stud_node *head)打印链表
输入输出示例:括号内为说明,无需输入输出
输入样例:
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
0
80
输出样例:
2 wang 80
4 zhao 85
题目要求尽量函数 清爽一些,我比较懒,选择主函数里实现
采用尾插法实现的,头插法这道题不适用,因为要按照学号的顺序
一般用带有头结点来建立链表,这样更简便一些
#include<cstdlib>
#include<cstdio>
#include<string.h>
typedef struct student//建立结构体
{
int n;
char name[100];//这里没有选择用string
//原因是scanf里的%s对string不兼容,好像是这样的......
int s;
struct student *next;
} stu;
using namespace std;
int main()
{
int x,y;
char a[100];
scanf("%d",&x);
stu* head = NULL;//定义头结点
head = new stu();
head->next =NULL;
stu *p =head;
while(x!=0)
{
scanf(" %s %d",a,&y);//没有用cin,而是选择scanf,对于整型和字符串的输入需要注意
stu *q = NULL;
q = new stu();
p->next = q;
q->n = x;
strcpy(q->name,a);//关于字符串函数的使用
q->s = y;
p = q;
scanf("%d",&x);
}
//以前因为判断是不是输入错误所以debug: printf("\nbull shit\n");
int line;
scanf("%d",&line);
p = head->next;
while(p!=NULL)
{
if(p->s>=line)
{
printf("%d %s %d\n",p->n,p->name,p->s);
p = p->next;
}
else
p = p->next;
}
p = head;
while(p!=NULL)//删除链表,防止超时
{
stu *q =p;
p = q->next;
free(q);
}
return 0;
}