单链表实现学生成绩管理系统

  • 前言
  • 需求分析
  • 详细设计
    • 增加成绩信息
    • 删除成绩信息
    • 修改成绩信息
    • 查询学生信息和浏览学生信息
  • 总结

前言

 上篇已经讲过单链表的基本实现,这篇将以一个简单的管理系统入手。
详细讲解下如何在原来单链表的基础上实现一个简单的管理系统。上篇文章入口:[单链表的实现](https://blog.csdn.net/qq_39625143/article/details/121420507?spm=1001.2014.3001.5501)

需求分析

 在各位同学的C语言入门课程中,很常见的会遇到各类管理系统的题目,
其实这些题目的要求大同小异,无外乎四个操作,增删改查。而在以后的工作中,
许多后端的工程师面里的最大的要求也就是增删改查。当然后面牵扯到大数据量的处理
数据库的优化等等...那么一个简单的学生成绩管理系统应该具备或者说基本的功能应该有,
学生成绩的录入、查询、修改、删除、以及统计,其中可能还牵扯到读写文件。
那么在已知这个的条件下,比较适合作为点链表存储的内容应该是学生信息结构体
typedef struct STUDENTINOF
{char id[BSIZE];char name[BSIZE];char major[BSIZE];int C;int computer;int physics;int atomic;int optics;
}s_info;typedef struct STUDENTNODE
{s_info info;struct STUDENTNODE * next;
}s_node;

详细设计

增加成绩信息

 一般情况下,学生的学号都会是唯一的,或者也可以以姓名作为唯一,
当然这个牵扯到详细的设计。在一般情况下我们都知道,姓名可能重复,但是
在学校里学号应该是唯一的,所以我们以学生的学号作为主键,那么我们就知道,当
学号重复的时候,当前数据就不应该被插入了,于是我们有了下面两段代码
// An highlighted block
s_node * CreateNode(s_info data)//创建学生节点
{s_node * node = (s_node*)malloc(sizeof(s_node));node->next = NULL;node->info = data;return node;
}
int FindStudent(char *id)//寻找学号是否已经在链表内
{s_node * node = h_node->next;while (node != NULL){if (strcmp(node->info.id, id) == 0){return 1;}node = node->next;}return 0;
}
int AddStudent(s_info info)//添加学生
{s_node * node = NULL;if (FindStudent(info.id) == 1)return 0;node = CreateNode(info);node->next = h_node->next;h_node->next = node;return 1;
}

删除成绩信息

 删除成绩信息也就是删除单链表内,符合条件的某个节点,那么一般我们会提供
一个条件作为删除的,在这里我是以学号作为删除条件
// An highlighted block
int DeleteINode(char *id)//删除学生成绩节点
{s_node * node = h_node;s_node * temp = NULL;while (node->next != NULL){if (strcmp(node->next->info.id, id) == 0){temp = node->next;node->next = temp->next;free(temp);return 1;}node = node->next;}return 0;
}

修改成绩信息

 修改和删除类似,不过修改是不需要释放节点,只需要吧数据进行修改,所以可以先找到节点的指针,然后把修改后
的数据赋值给节点内当前数据。ps:这里有个地方要注意,结构体可以用=号进行赋值,但是如果是数组的话不可以直接
赋值,要用具体的拷贝函数。
// An highlighted block
int UpdateINode(s_info info)//更新学生成绩信息
{s_node * node = h_node;while (node->next != NULL){if (strcmp(node->next->info.id, info.id) == 0){node->next->info = info;return 1;}node = node->next;}return 0;
}

查询学生信息和浏览学生信息

 这两个放到一起来说,其实两个功能没有本质上的区别,都是对单链表的遍历。查询顾名思义,根据某种条件
查找符合条件的学生信息进行打印。浏览则是把每一个学生成绩信息都打印出来
// An highlighted block
void SelectSocreForID(char *id)//查询学号为xx的成绩信息
{s_node * node = h_node->next;while (node != NULL){if (strcmp(node->info.id, id) == 0){printf("学号:%s\n姓名:%s\n专业:%s\nC语言:%d\n计算物理学:%d\n大学物理:%d\n原子物理:%d\n光学:%d\n", node->info.id, node->info.name, node->info.major, node->info.C, node->info.computer, node->info.physics, node->info.atomic, node->info.optics);return;}node = node->next;}printf("未查找到对应学生信息\n");
}void SelectSocreForName(char *name)//根据姓名查询
{s_node * node = h_node->next;printf("  学号\t\t    姓名  \t  专业\tC语言\t计算物理学\t大学物理\t原子物理\t光学\n");while (node != NULL){if (strcmp(node->info.name, name) == 0){printf("%s\t%8s\t%6s\t%5d\t%10d\t%8d\t%8d\t%4d\n", node->info.id, node->info.name, node->info.major, node->info.C, node->info.computer, node->info.physics, node->info.atomic, node->info.optics);}node = node->next;}
}void SelectSocreForMajor(char *major)//根据专业查询
{s_node * node = h_node->next;printf("  学号\t\t    姓名  \t  专业\tC语言\t计算物理学\t大学物理\t原子物理\t光学\n");while (node != NULL){if (strcmp(node->info.major, major) == 0){printf("%s\t%8s\t%6s\t%5d\t%10d\t%8d\t%8d\t%4d\n", node->info.id, node->info.name, node->info.major, node->info.C, node->info.computer, node->info.physics, node->info.atomic, node->info.optics);}node = node->next;}
}void SelectAllStudent()//浏览学生信息
{s_node * node = h_node->next;printf("  学号\t\t    姓名  \t  专业\tC语言\t计算物理学\t大学物理\t原子物理\t光学\n");while (node != NULL){printf("%s\t%8s\t%6s\t%5d\t%10d\t%8d\t%8d\t%4d\n", node->info.id, node->info.name, node->info.major, node->info.C, node->info.computer, node->info.physics, node->info.atomic, node->info.optics);node = node->next;}
}void SelectSocre(char *id, int subject)//根据学号,科目 打印学生成绩信息
{s_node * node = h_node->next;while (node != NULL){if (strcmp(node->info.id, id) == 0){switch (subject){case 1:printf("C语言成绩:%d\n", node->info.C);return;case 2:printf("计算物理学成绩:%d\n", node->info.computer);return;case 3:printf("大学物理成绩:%d\n", node->info.physics);return;case 4:printf("原子物理成绩:%d\n", node->info.atomic);return;case 5:printf("光学成绩:%d\n", node->info.optics);return;default:return;}}node = node->next;}printf("未查找到成绩信息\n");
}
void SelectSocreCount(char *id)//根据学号查询总分
{s_node * node = h_node->next;while (node != NULL){if (strcmp(node->info.id, id) == 0){printf("总成绩:%d\n", node->info.C + node->info.computer + node->info.physics + node->info.atomic + node->info.optics);}node = node->next;}
}

总结

 以上就是对一个完整的操作单链表的管理系统,这里略去了界面录入这一块,需要的可以到我的csdn资源里下载,
也可以留下邮箱,博主给你们发送,总而言之希望这篇博文对朋友们的单链表学习有所帮助
资源地址[C语言学生成绩管理系统](https://download.csdn.net/download/qq_39625143/46722059)

C语言基础篇02:单链表实现学生成绩管理系统相关推荐

  1. c语言用链表实现成绩管理系统,C语言基于单链表得学生成绩管理系统

    前言 传说中讲课通俗而不庸俗,说话风流而不下流的小编又来了哦,今天的主要内容是:C语言基于单链表得学生成绩管理系统.首先给年夜家总结下为什么你们学习C语言会觉得难,尤其是对单链表这块,主要原因得是因为 ...

  2. C语言链表学生成绩制作成链表,C语言程序设计课程设计基于链表的学生成绩管理系统.doc...

    C语言程序设计课程设计基于链表的学生成绩管理系统 华北科技学院计算机系综合性实验报告 PAGE 第 PAGE 10 页 华北科技学院计算机系综合性实验 实 验 报 告 课程名称 C语言程序设计 实验学 ...

  3. 基于链表的学生成绩最高分计算问题计算用c语言编写课程设计,C语言程序设计课程设计-基于链表的学生成绩管理系统.doc...

    xh,p->xm,p->gs,p->yy,p->wl); p=p->next; } fclose(fp); printf("保存结束按任意键继续\n" ...

  4. c语言程序设计 链表,c语言程序设计基于链表的学生成绩管理系统.doc

    c语言程序设计基于链表的学生成绩管理系统 华北科技学院计算机系综合性实验报告 PAGE 第 PAGE 10 页 华北科技学院计算机系综合性实验 实 验 报 告 课程名称 C语言程序设计 实验学期 20 ...

  5. 用链表c语言程序设计,C语言程序设计-基于链表的学生成绩管理系统

    <C语言程序设计-基于链表的学生成绩管理系统>由会员分享,可在线阅读,更多相关<C语言程序设计-基于链表的学生成绩管理系统(18页珍藏版)>请在人人文库网上搜索. 1.华北科技 ...

  6. 成绩管理系统c语言流程图,C语言可视化程序课程的设计:学生成绩管理系统.doc...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspC/C++资料 C语言可视化程序课程的设计:学生成绩管理系统.d ...

  7. c语言实现学生二科成绩的单链表,c++链表实现学生成绩管理系统(简易版)

    #include using namespace std; typedef struct student{ int id;//学号 string sex; string name; int cpp;/ ...

  8. 用C语言链表编写学生成绩管理系统

    本代码供读者学习使用,请不要随意转载. 一.设计题目:学生成绩管理系统 二.目的与要求 每位学生记录包含有学号.姓名.性别.出生日期.三门功课的成绩(高等数学.大学英语.C语言).总分和平均分 系统菜 ...

  9. 基于go语言的史上最流弊的学生成绩管理系统

    简介 一个基于go语言的学生成绩管理系统,没有花里胡哨的界面,但有你想象不到的功能:没有mysql,redis做支撑,但文件管理也不赖 :没有高大上的高级语法,但经验告诉我:大道至简! 刚刚学习完go ...

最新文章

  1. sudo apt-get update: 0% [正在等待报头]
  2. 68)deque数组
  3. java 线程模型_Java基础篇之Java线程模型
  4. leetcode896. 单调数列
  5. linux内核更新 2.6.38,Linux内核 2.6.38版本预计到四月初完成
  6. win10系统电脑wifi图标不见了的开启方法
  7. 2021年移动市场报告.pdf
  8. Juniper大中国区于肇烈
  9. iPhone 12主板曝光:布局更紧凑 满满苹果基因
  10. 使用html+css仿搜狐网址页面布局
  11. 图像采样、量化、编码(二十七)
  12. 7-88 求一元二次方程的根
  13. c++,kmin,kmax
  14. 三次曲线和五次曲线函数
  15. 一周侃 | 周末随笔
  16. 虚函数占用类空间大小(转)
  17. 【html标签复习】
  18. Android 软件开发时用到的一些有用软件列表
  19. jdk11手动安装jre
  20. [codeforces 1333A] Little Artem 读懂题+找规律+多举例

热门文章

  1. 论文模型构建的步骤_最新论文:智能安全情报分析模型的构建
  2. ThinkPHP 关闭调试模式
  3. 油漆算法问题_不同类型的油漆(以及何时使用它们)
  4. 38个常用Python库:数值计算、可视化、机器学习等8大领域都有了
  5. 图像基本处理——图像阈值和平滑
  6. R语言GARCH-DCC模型和DCC(MVT)建模估计
  7. 容器-Docker《二》命令帮助镜像管理
  8. iphone文件访问ftp服务器,ipad ftp服务器 iPhone/iPad访问FTP服务器设置步骤
  9. 灾备联盟牵头研制《云灾备技术发展趋势与应用白皮书》
  10. 2023英语作文模板