现在想将学生绩点组成一个链表。链表结点内容包括学生姓名,学号,绩点。
输入是一组学生的姓名、学号和绩点,以链表形式存储,结点顺序即学生信息的输入顺序。
请在原链接中删除绩点小于平均绩点的学生结点,然后按照输入的顺序,依序输出新链表的学生信息。
平均绩点是输入的所有学生绩点取算术平均值。
1.本题中,头文件已经添加,且学生结点和头结点定义如下:
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>
// 学生结点定义
typedef struct student
{
char name[20];//姓名
char no[20];//学号
float grade;//绩点
struct student *next;
} stu;
// 头结点定义
typedef struct
{
int n; //学生个数
float sum;//学生绩点和
float avg;//平均绩点
stu *first;
} HeadNode;
2.本题中,main函数已经写好了,main函数如下:
int main()
{
HeadNode *head;
// 创建链表
head = create();
// 删除低于平均绩点的学生信息
deleteLessThanAvg(head);
// 输出链表信息
printLinkedTable(head);
return 0;
}
请编写除了main函数以外的create()、deleteLessThanAvg(head)、printLinkedTable(head)三个函数以及其他相关代码并提交!
注意:
1.头文件引用、结构体类型声明、main函数本题已经内置,无须提交到代码框!代码框中只需要提交create()、deleteLessThanAvg(head)、printLinkedTable(head)三个函数代码!!
2.如果在自己的环境中调试程序,头文件、结构体声明、main函数要与本题的内置内容一致才行!
请思考一个问题:本题中的deleteLessThanAvg(head)和printLinkedTable(head)函数为什么可以没有返回值?而create()函数必须有返回值?
输入描述
输入包括若干行。 每行是一个学生的姓名、学号和绩点,以空格隔开。
最后一行是*.
输出描述
输出包括学生姓名。 每个学生姓名一行。
提示
1.在删除低于平均绩点的学生数据时,若链表为空,则输出:This is a null linked table,can't delete any node!
2.在输出链表信息时,若链表为空,则输出:This is a null linked table!
3.结构体空间需要使用malloc申请!
4.无用的空间需要使用free释放!
HeadNode *create()
{
HeadNode *head=NULL;
head=(HeadNode*)malloc(sizeof(HeadNode));//给头节点申请,存储数据
if(head==NULL) exit(0);
head->n=head->sum=head->avg=0;//初始化头节点
stu *p1=NULL,*p2=NULL;
int n=0;
char temp[20];
p2=(stu*)malloc(sizeof(stu));
do{
n++;
scanf("%s",temp);
if(n==1&&strcmp(temp,"*")==0) return NULL;
else if(n!=1&&strcmp(temp,"*")==0) break;
else {
p1=(stu*)malloc(sizeof(stu));
strcpy(p1->name,temp);
scanf("%s %f",p1->no,&p1->grade);
}
if(n==1) head->first=p1;
else p2->next=p1;
p2=p1;
head->n++;
head->sum+=p1->grade;
head->avg=head->sum/head->n;
}while(1);
p2->next=NULL;
return head;
}
void deleteLessThanAvg(HeadNode *head)
{
if(head==NULL) printf("This is a null linked table,can't delete any node!\n");
else {
stu *p=head->first,*q=NULL;
while(p!=NULL){
if(p->grade<head->avg){
if(q==NULL) head->first=p->next;
else q->next=p->next;
stu *temp=p;
p=p->next;
free(temp);
}
else {
q=p;
p=p->next;
}
}
}
}
void printLinkedTable(HeadNode *head)
{
if(head==NULL){
printf("This is a null linked table!\n");
exit(0);
}
stu *p=NULL;
for(p=head->first;p!=NULL;p=p->next){
printf("%s\n",p->name);
}
}