C语言嵌套链表实现学生成绩管理系统

C语言嵌套链表实现学生成绩管理系统

链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。 场景: 一个年级,相当链表A 该年级5个班,每个班5个人,相当于链表B1--B5 做一个学生成绩管理系统 学生成绩有语文 数学 英语 功能: 录入成绩 找三科总分的最高分 最低分 算出平均分

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。

链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。

链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。

说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

作为有强大功能的链表,对他的操作当然有许多,比如:链表的创建,修改,删除,插入,输出,排序,反序,清空链表的元素,求链表的长度等等。
C语言嵌套链表实现学生成绩管理系统:熟悉链表的创建,结构体指针的使用。

实现思路:创建学生链表->创建班级链表
其中
学生链表的结点的数据域存放学生的信息;
班级链表的结点的数据域为指向学生链表头结点的指针;
利用这样的嵌套链表实现多个班级,以及每个班级多个学生的成绩管理。


提示:以下是本篇文章正文内容,下面案例可供参考

一、代码实现

1.包含头文件

代码如下(示例):

#include<stdio.h>
#include<stdlib.h>

2.定义学生链表的结点

代码如下(示例):

struct Student //声明学生链表的节点
{
        int chinese;
        int math;
        int english;
        int sum;
        struct Student* next;
};



3.定义班级链表的结点

代码如下(示例):

struct Class//声明班级链表的节点
{
        struct Student* student;
        struct Class* next;
};




4.创建一个新的学生链表的结点并且通过尾插法插入链表中

代码如下(示例):

struct Student* CreateStudentNode(struct Student*head,int num)//生成一个新的学生节点并且利用尾插法插入链表中
{
        struct Student* p=NULL;
        struct Student* node=(struct Student*)malloc(sizeof(struct Student));//为新节点开辟空间
        //初始化新节点
        node->next=NULL;
        printf("输入第%d个学生的信息:(语文 数学 英语)\n",num+1);
        scanf("%d %d %d",&node->chinese,&node->math,&node->english);
        node->sum=node->chinese+node->math+node->english;

        if(head->next==NULL){                                     //链表只有一个节点时
                head->next=node;
                return head;
        }
        else{                                                     //链表有多个节点时  将指针p移到链表尾  
                p=head;
                while(p->next!=NULL){    p=p->next;  }      //将指针p移到链表尾     
        }

        p->next=node;
        return head;
}





5.生成学生链表

代码如下(示例):

struct Student* init_StudentLink()//生成学生链表
{
        int sum,i;
        struct Student* head=(struct Student*)malloc(sizeof(struct Student));//生成头节点
        struct Student* p=NULL;
        scanf("%d",&sum);//学生数
        for(i=0;i<sum;i++){

                p=CreateStudentNode(head,i);

        }

        return p;
}


6.创建一个新的班级链表的结点并且通过尾插法插入链表中

代码如下(示例):

struct Class* CreateClassNode(struct Class* head,int num)//生成一个新的班级节点并且利用尾插法插入链表中
{
        struct Class* p=NULL;
        struct Class* node=(struct Class*)malloc(sizeof(struct Class));
        node->next=NULL;
        struct Student* q=NULL;

        printf("输入第%d班级的人数:\n",num+1);
        q=init_StudentLink();
        node->student=q;

        if(head->next==NULL){
                head->next=node;
        }
        else{
                p=head;
                while(p->next!=NULL){ p=p->next; }

        }

        return 0;

}



7.生成班级链表

代码如下(示例):

void init_Class(struct Class* head)//生成班级链表
{
        int sum,i;
        printf("请输入建立的班级数\n");
        scanf("%d",&sum);
        for(i=0;i<sum;i++){
                CreateClassNode(head,i);
        }

}

8.打印结点信息

代码如下(示例):

void printf_node(struct Class *head)//打印节点信息
{
        int max,min;
        struct Class *q=NULL;
        struct Student *p=NULL;
        q=head->next;
        min=max=q->student->next->sum;
        printf("*****************************************************************************************************\n");
        printf("成绩统计\t(语文\t数学\t英语\t总分\t平均分)\n");
        printf("*****************************************************************************************************\n");

        int i=0,j=0;
        p=q->student->next;
        while(q){
                i++;
                for(p;p->next!=NULL;p=p->next){
                        j++;
                        printf("第%d班第%d学生的成绩\n",i,j);
                        printf("语文:%d 数学:%d  英语:%d 总分:%d 平均分:%lf\n",p->chinese,p->math,p->english,p->sum,(double)(p->sum)/3);
                        if(p->sum>max){
                                max=p->sum;
                        }
                        if(p->sum<min){
                                min=p->sum;
                        }

                }
                printf("\n");
                q=q->next;
                j=0;
        }

        printf("总分最高为:%d\n",max);
        printf("总分最低为:%d\n",min);
}


9,主函数

代码如下(示例):

int main()
{

        struct Class* head=(struct Class*)malloc(sizeof(struct Class));
        head->next=NULL;//生成班级头结点
        init_Class(head);//生成班级链表
        printf_node(head);//打印信息

        return 0;
}


  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言是一种非常流行的编程语言,它拥有强大的数据结构和操作能力,非常适合用来实现学生成绩管理系统链表是一种常用的数据结构,可以动态地添加、删除和查找数据,非常适合存储学生成绩信息。 首先,我们需要定义一个链表结构体,用来存储学生成绩的信息。结构体包括学生姓名、学生学号和学生成绩等字段。 然后,我们可以定义一些操作链表的函数,例如添加学生成绩、删除学生成绩和查询学生成绩等。 添加学生成绩的函数可以接受用户输入的学生信息,并将其添加到链表中。首先创建一个新的节点,并将用户输入的学生信息存储到节点的字段中。然后将新节点插入到链表的末尾或指定的位置。 删除学生成绩的函数可以接受用户输入的学生学号,并在链表中查找该学生,然后将其删除。首先从链表的头节点开始遍历,找到要删除的节点,然后将其从链表中移除,并释放该节点的内存。 查询学生成绩的函数可以接受用户输入的学生学号,并在链表中查找该学生,并将学生的信息显示出来。首先从链表的头节点开始遍历,找到要查询的节点,然后将节点的字段信息显示给用户。 最后,我们可以编写一个主函数来接受用户的操作指令,并调用相应的函数来实现学生成绩管理系统。用户可以选择添加学生信息、删除学生信息、查询学生信息等操作。 以上就是用C语言链表实现学生成绩管理系统的简要过程。当然,在实际开发中还需要考虑异常情况的处理、数据的持久化存储等问题,希望能对你有所启发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值