创建带头节点的链表

现在想将学生绩点组成一个链表。链表结点内容包括学生姓名,学号,绩点。

输入是一组学生的姓名、学号和绩点,以链表形式存储,结点顺序即学生信息的输入顺序。

请在原链接中删除绩点小于平均绩点的学生结点,然后按照输入的顺序,依序输出新链表的学生信息。

平均绩点是输入的所有学生绩点取算术平均值。

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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值