将学生成绩绩点组成一个链表。链表结构如下:
struct student {
string name; //学生姓名
double gpa; //绩点
student *next;
};
输入是一组学生的姓名和绩点,以链表形式存储。 删除绩点小于平均绩点的学生结点,成为一个新链表。 后按照输入的顺序,依序输出新链表的学生信息。平均绩点是输入的所有学生绩点取算术平均值。
输入格式:
输入包括若干行。 每行是一个学生的 姓名和绩点,以空格隔开。
最后一行是-1。
输出格式:
输出包括学生姓名。 每个学生姓名一行。
输入样例:
zhang 3.5
liu 2.1
tie 1.9
-1
输出样例:
zhang
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student {
char name[20]; //学生姓名
double gpa; //绩点
struct student *next;
};
void text(struct student *head);
struct student *Creat_Stu_Doc();
struct student *DeleteDoc(struct student *head,int score);
double pingjun(struct student *head);
int main()
{
double gpa;
struct student *head;
head=NULL;
head=Creat_Stu_Doc();
gpa=pingjun(head);
DeleteDoc(head,gpa);
text(head);
return 0;
}
struct student *Creat_Stu_Doc()
{
struct student *head,*p,*t;
head=NULL;
char name[20];
while(1)
{
scanf("%s",name);
if(name[0]!='-')
break;
p=(struct student *)malloc(sizeof(struct student));
strcpy(p->name,name);
scanf("%lf",&p->gpa);
if(head==NULL)
{head=p;
t=head;
}
else
{
t->next = p;
t = p;
}
}
t->next = NULL;
return head;
}
struct student *DeleteDoc(struct student *head,int score)
{
struct student *p,*p1;
while(head->gpa<score)
{
p=head;
head=head->next ;
free(p);
}
p=head,p1=head->next ;
while(p1!=NULL)
{
if(p1->gpa <score)
{
p->next = p1->next ;
free(p1);
p1=p->next ;
}
else
{
p=p1;
p1=p1->next ;
}
}
return head;
}
void text(struct student *head)
{
struct student *p;
for(p=head;p!=NULL;p=p->next)
{
printf("%s\n",p->name);
}
}
double pingjun(struct student *head)
{
double x=0,a=0;
struct student *p;
for(p=head;p!=NULL;p=p->next,a++)
{
x+=p->gpa;
}
x=x/a;
return x;
}