经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C语言嵌套链表实现学生成绩管理系统
来源:jb51  时间:2022/7/25 19:16:03  对本文有异议

C语言嵌套链表实现学生成绩管理系统,供大家参考,具体内容如下

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

前言

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

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

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

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

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

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

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

一、代码实现

1.包含头文件

代码如下(示例):

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

2.定义学生链表的结点

代码如下(示例):

  1. struct Student //声明学生链表的节点
  2. {
  3. ? ? ? ? int chinese;
  4. ? ? ? ? int math;
  5. ? ? ? ? int english;
  6. ? ? ? ? int sum;
  7. ? ? ? ? struct Student* next;
  8. };

3.定义班级链表的结点

代码如下(示例):

  1. struct Class//声明班级链表的节点
  2. {
  3. ? ? ? ? struct Student* student;
  4. ? ? ? ? struct Class* next;
  5. };

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

代码如下(示例):

  1. struct Student* CreateStudentNode(struct Student*head,int num)//生成一个新的学生节点并且利用尾插法插入链表中
  2. {
  3. ? ? ? ? struct Student* p=NULL;
  4. ? ? ? ? struct Student* node=(struct Student*)malloc(sizeof(struct Student));//为新节点开辟空间
  5. ? ? ? ? //初始化新节点
  6. ? ? ? ? node->next=NULL;
  7. ? ? ? ? printf("输入第%d个学生的信息:(语文 数学 英语)\n",num+1);
  8. ? ? ? ? scanf("%d %d %d",&node->chinese,&node->math,&node->english);
  9. ? ? ? ? node->sum=node->chinese+node->math+node->english;
  10.  
  11. ? ? ? ? if(head->next==NULL){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //链表只有一个节点时
  12. ? ? ? ? ? ? ? ? head->next=node;
  13. ? ? ? ? ? ? ? ? return head;
  14. ? ? ? ? }
  15. ? ? ? ? else{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //链表有多个节点时 ?将指针p移到链表尾 ?
  16. ? ? ? ? ? ? ? ? p=head;
  17. ? ? ? ? ? ? ? ? while(p->next!=NULL){ ? ?p=p->next; ?} ? ? ?//将指针p移到链表尾 ? ??
  18. ? ? ? ? }
  19.  
  20. ? ? ? ? p->next=node;
  21. ? ? ? ? return head;
  22. }

5.生成学生链表

代码如下(示例):

  1. struct Student* init_StudentLink()//生成学生链表
  2. {
  3. ? ? ? ? int sum,i;
  4. ? ? ? ? struct Student* head=(struct Student*)malloc(sizeof(struct Student));//生成头节点
  5. ? ? ? ? struct Student* p=NULL;
  6. ? ? ? ? scanf("%d",&sum);//学生数
  7. ? ? ? ? for(i=0;i<sum;i++){
  8.  
  9. ? ? ? ? ? ? ? ? p=CreateStudentNode(head,i);
  10.  
  11. ? ? ? ? }
  12.  
  13. ? ? ? ? return p;
  14. }

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

代码如下(示例):

  1. struct Class* CreateClassNode(struct Class* head,int num)//生成一个新的班级节点并且利用尾插法插入链表中
  2. {
  3. ? ? ? ? struct Class* p=NULL;
  4. ? ? ? ? struct Class* node=(struct Class*)malloc(sizeof(struct Class));
  5. ? ? ? ? node->next=NULL;
  6. ? ? ? ? struct Student* q=NULL;
  7.  
  8. ? ? ? ? printf("输入第%d班级的人数:\n",num+1);
  9. ? ? ? ? q=init_StudentLink();
  10. ? ? ? ? node->student=q;
  11.  
  12. ? ? ? ? if(head->next==NULL){
  13. ? ? ? ? ? ? ? ? head->next=node;
  14. ? ? ? ? }
  15. ? ? ? ? else{
  16. ? ? ? ? ? ? ? ? p=head;
  17. ? ? ? ? ? ? ? ? while(p->next!=NULL){ p=p->next; }
  18.  
  19. ? ? ? ? }
  20.  
  21. ? ? ? ? return 0;
  22.  
  23. }

7.生成班级链表

代码如下(示例):

  1. void init_Class(struct Class* head)//生成班级链表
  2. {
  3. ? ? ? ? int sum,i;
  4. ? ? ? ? printf("请输入建立的班级数\n");
  5. ? ? ? ? scanf("%d",&sum);
  6. ? ? ? ? for(i=0;i<sum;i++){
  7. ? ? ? ? ? ? ? ? CreateClassNode(head,i);
  8. ? ? ? ? }
  9.  
  10. }

8.打印结点信息

代码如下(示例):

  1. void printf_node(struct Class *head)//打印节点信息
  2. {
  3. ? ? ? ? int max,min;
  4. ? ? ? ? struct Class *q=NULL;
  5. ? ? ? ? struct Student *p=NULL;
  6. ? ? ? ? q=head->next;
  7. ? ? ? ? min=max=q->student->next->sum;
  8. ? ? ? ? printf("*****************************************************************************************************\n");
  9. ? ? ? ? printf("成绩统计\t(语文\t数学\t英语\t总分\t平均分)\n");
  10. ? ? ? ? printf("*****************************************************************************************************\n");
  11.  
  12. ? ? ? ? int i=0,j=0;
  13. ? ? ? ? p=q->student->next;
  14. ? ? ? ? while(q){
  15. ? ? ? ? ? ? ? ? i++;
  16. ? ? ? ? ? ? ? ? for(p;p->next!=NULL;p=p->next){
  17. ? ? ? ? ? ? ? ? ? ? ? ? j++;
  18. ? ? ? ? ? ? ? ? ? ? ? ? printf("第%d班第%d学生的成绩\n",i,j);
  19. ? ? ? ? ? ? ? ? ? ? ? ? printf("语文:%d 数学:%d ?英语:%d 总分:%d 平均分:%lf\n",p->chinese,p->math,p->english,p->sum,(double)(p->sum)/3);
  20. ? ? ? ? ? ? ? ? ? ? ? ? if(p->sum>max){
  21. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? max=p->sum;
  22. ? ? ? ? ? ? ? ? ? ? ? ? }
  23. ? ? ? ? ? ? ? ? ? ? ? ? if(p->sum<min){
  24. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? min=p->sum;
  25. ? ? ? ? ? ? ? ? ? ? ? ? }
  26.  
  27. ? ? ? ? ? ? ? ? }
  28. ? ? ? ? ? ? ? ? printf("\n");
  29. ? ? ? ? ? ? ? ? q=q->next;
  30. ? ? ? ? ? ? ? ? j=0;
  31. ? ? ? ? }
  32.  
  33. ? ? ? ? printf("总分最高为:%d\n",max);
  34. ? ? ? ? printf("总分最低为:%d\n",min);
  35. }

9,主函数

代码如下(示例):

  1. int main()
  2. {
  3.  
  4. ? ? ? ? struct Class* head=(struct Class*)malloc(sizeof(struct Class));
  5. ? ? ? ? head->next=NULL;//生成班级头结点
  6. ? ? ? ? init_Class(head);//生成班级链表
  7. ? ? ? ? printf_node(head);//打印信息
  8.  
  9. ? ? ? ? return 0;
  10. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号