-
2021-03-24 14:21:44
单链表:学生成绩管理系统
student.h
#pragma once #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> struct STUDENT { char ID[8]; char name[20]; char sex[4]; int chinese; int math; int english; int zh; int total; }; struct STUD { struct STUDENT data; struct STUD *next; }; //菜单选项 void menu(); //创建链表 struct STUD *CreateLink(); //输出链表 void OutputLink(struct STUD *); //录入学生成绩信息 struct STUD *InputStud(int); //通过学号查询学生信息 void QueryLink(struct STUD *); //添加学生成绩信息 void AddNode(struct STUD *); //存储学生成绩信息 void SaveLink(struct STUD *); //读取学生成绩信息 struct STUD *ReadLink(); //浏览学生成绩信息 void ShowLink(struct STUD *phead); //删除学生成绩信息 void DelNode(struct STUD *phead); //查看学生成绩统计信息 void DisplayLink(); //子菜单1 int menu1(); //按总分排序 void SortTotal(struct STUD *phead); //按语文成绩排序 void SortChinese(struct STUD *phead); //按数学成绩排序 void SortMath(struct STUD *phead); //按英语成绩排序 void SortEnglish(struct STUD *phead); //按综合成绩排序 void SortZh(struct STUD *phead); //排序 void SortNode(struct STUD *phead, char *s);
student.c
#include "student.h" extern struct STUD *head; //extern 使得可以在这儿使用HeadNode.c中定义的全局变量 head头指针 //创建链表 struct STUD *CreateLink() { int count = 0, i; struct STUD *phead, *pend, *pnew; phead = ( struct STUD * )malloc(sizeof(struct STUD)); if (NULL == phead) { printf("\t\t\t内存分配失败,程序终止!\n"); exit(-1); } head = phead; pend = phead; printf("\n\t\t\t 请输入学生人数: "); rewind(stdin); scanf("%d", &count); for (i=0; i<count; i++) { pnew = InputStud(i + 1); pend->next = pnew; pnew->next = NULL; pend = pnew; } printf("\n\t\t\t学生成绩信息录入完成!\n\n"); printf("\n\t\t\t正在保存。。。"); rewind(stdin); getchar(); SaveLink(phead); return phead; } //录入学生成绩信息 struct STUD *InputStud(int n) { struct STUD *p = ( struct STUD * )malloc(sizeof(struct STUD)); if ( NULL == p ) { printf("\t\t\t内存分配失败,程序终止!\n"); exit(-1); }; int count = 0; printf("\n\t\t\t请输入第%d个学生的学号:", n); rewind(stdin); scanf("%s", p->data.ID); printf("\t\t\t\n"); while ( strlen(p->data.ID) < 0 || strlen(p->data.ID) > 8 ) { count++; printf("\t\t\t你输入的学号错误,请重新输入8位以内学号!\n"); printf("\t\t\t"); rewind(stdin); scanf("%s", p->data.ID); if ( 3 == count ) { printf("\t\t\t你输入的学号错误次数过多,退出系统!"); exit(0); } } printf("\t\t\t请输入第%d个学生的姓名:", n); rewind(stdin); scanf("%s", p->data.name); printf("\t\t\t\n"); printf("\t\t\t请输入第%d个学生的性别:", n); rewind(stdin); scanf("%s", p->data.sex); printf("\t\t\t\n"); count = 0; while ( strcmp(p->data.sex, "男") != 0 && strcmp(p->data.sex, "女") != 0 ) { count++; printf("\t\t\t你输入的性别错误,请重新输入!\n"); printf("\t\t\t"); rewind(stdin); scanf("%s", p->data.sex); if ( 3 == count ) { printf("\t\t\t你输入的性别错误次数过多,退出系统!"); exit(0); } } printf("\t\t\t请输入第%d个学生的语文成绩:", n); rewind(stdin); scanf("%d", &p->data.chinese); printf("\t\t\t\n"); count = 0; while ( p->data.chinese < 0 || p->data.chinese >150 ) { count++; printf("\t\t\t你输入的语文成绩错误,请重新输入!\n"); printf("\t\t\t"); rewind(stdin); scanf("%d", &p->data.chinese); if ( 3 == count ) { printf("\t\t\t你输入的语文成绩错误次数过多,退出系统!"); exit(0); } } printf("\t\t\t请输入第%d个学生的数学成绩:", n); rewind(stdin); scanf("%d", &p->data.math); printf("\t\t\t\n"); count = 0; while ( p->data.math < 0 || p->data.math >150 ) { count++; printf("\t\t\t你输入的数学成绩错误,请重新输入!\n"); printf("\t\t\t"); rewind(stdin); scanf("%d", &p->data.math); if ( 3 == count ) { printf("\t\t\t你输入的数学成绩错误次数过多,退出系统!"); exit(0); } } printf("\t\t\t请输入第%d个学生的英语成绩:", n); rewind(stdin); scanf("%d", &p->data.english); printf("\t\t\t\n"); count = 0; while ( p->data.english < 0 || p->data.english >150 ) { count++; printf("\t\t\t你输入的英语成绩错误,请重新输入!\n"); printf("\t\t\t"); rewind(stdin); scanf("%d", &p->data.english); if ( 3 == count ) { printf("\t\t\t你输入的英语成绩错误次数过多,退出系统!"); exit(0); } } printf("\t\t\t请输入第%d个学生的理(文)综成绩:", n); rewind(stdin); scanf("%d", &p->data.zh); printf("\t\t\t\n"); count = 0; while ( p->data.zh < 0 || p->data.zh >300 ) { count++; printf("\t\t\t你输入的理(文)综成绩错误,请重新输入!\n"); printf("\t\t\t"); rewind(stdin); scanf("%d", &p->data.zh); if ( 3 == count ) { printf("\t\t\t你输入的理(文)综成绩错误次数过多,退出系统!"); exit(0); } } p->data.total = p->data.chinese + p->data.math + p->data.english + p->data.zh; return p; } //输出链表 void OutputLink(struct STUD *phead) { if (NULL == phead) { printf("\n\t\t\t 读取学生成绩信息失败,程序终止!\n"); exit(-1); } struct STUD *p = phead->next; printf("\n\t\t\t学号\t姓名\t性别\t语文\t数学\t英语\t综合\t总分\n"); printf("\t\t======================================================================\n"); while ( NULL != p ) { printf("\t\t\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p->data.ID, p->data.name, p->data.sex, p->data.chinese, p->data.math, p->data.english, p->data.zh, p->data.total); p = p->next; } } //通过学号查询学生信息 void QueryLink(struct STUD *phead) { char sID[8] = { '\0' }; if (NULL == phead) { phead = ( struct STUD * )malloc(sizeof(struct STUD)); phead->next = NULL; phead = ReadLink(); struct STUD *pnow = phead; } struct STUD *p = phead->next; printf("\t\t\t请输入要查询的学号: "); scanf("%s", sID); printf("\t\t\t\n"); while ( NULL != p) { if ( strcmp(sID, p->data.ID) == 0 ) { printf("\n\t\t\t学号\t姓名\t性别\t语文\t数学\t英语\t综合\t总分\n"); printf("\t\t======================================================================\n"); printf("\t\t\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p->data.ID, p->data.name, p->data.sex, p->data.chinese, p->data.math, p->data.english, p->data.zh, p->data.total); printf("\n\n\t\t\t按任意键继续....... "); rewind(stdin); getchar(); return; } p = p->next; } rewind(stdin); printf("\n\t\t\t学号 %s 未找到,按任意键继续....... ", sID); getchar(); } //添加学生成绩信息 void AddNode(struct STUD *phead) { int num = 0, i = 0; char sID[8] = { '\0' }; if ( NULL == phead ) { phead = ( struct STUD * )malloc(sizeof(struct STUD)); phead->next = NULL; phead = ReadLink(); } struct STUD *pnew = phead, *pmove = NULL; printf("\t\t\t查询要添加的学号是否存在:\n\n"); QueryLink(phead); printf("\t\t\t请输入要添加学生的人数: "); scanf("%d", &num); printf("\t\t\t\n\n"); while ( NULL != pnew->next ) { pnew = pnew->next; } for ( i = 0; i < num; i++) { pmove = InputStud(i + 1); pnew->next = pmove; pmove->next = NULL; pnew = pmove; } SaveLink(phead); rewind(stdin); printf("\n\n\t\t\t添加学生信息完成,按任意键继续....... "); getchar(); } //保存学生信息 void SaveLink(struct STUD *phead) { if ( NULL == phead ) { printf("\t\t\t学生成绩信息为空,程序终止!\n"); exit(-1); } struct STUD *p = phead->next; FILE *fp; if (( fp = fopen("student.bin", "wb")) == NULL) { printf("\t\t\t不能存储文件,程序终止!\n"); exit(-1); } while ( NULL != p ) { fwrite(p, sizeof(struct STUD), 1, fp); p = p->next; } printf("\t\t\t存储文件完成!\n"); fclose(fp); } //读取学生成绩信息 struct STUD *ReadLink() { int i = 1; system("cls"); printf("\n\t\t\t 正在从文件中读取 \n\n"); printf("\n\t\t "); while ( i < 30 ) { printf("#"); i++; Sleep(5); } //Sleep(5000); struct STUD *phead = ( struct STUD * )malloc(sizeof(struct STUD)); phead->next = NULL; struct STUD *pnow = phead; FILE *fp; if ( ( fp = fopen("student.bin", "rb") ) == NULL ) { printf("\t\t\t读取文件失败,程序终止!\n"); exit(-1); } fseek(fp, 0, SEEK_SET); struct STUD *q = NULL; while ( 1 ) { q = ( struct STUD * )malloc(sizeof(struct STUD)); if ( fread(q, sizeof(struct STUD), 1, fp) == 1 ) { pnow->next = q; q->next = NULL; pnow = q; } else break; } fclose(fp); printf("\n\n\t\t\t 从文件中读取成功! \n\n"); return phead; } //浏览学生成绩信息 void ShowLink(struct STUD *phead) { if (NULL == phead) { phead = ( struct STUD * )malloc(sizeof(struct STUD)); phead->next = NULL; phead = ReadLink(); } printf("\n\t\t\t\n"); OutputLink(phead); rewind(stdin); printf("\n\t\t\t按任意键继续....... "); getchar(); } //删除学生成绩信息 void DelNode(struct STUD *phead) { char sID[8] = { '\0' }; if ( NULL == phead ) { phead = ( struct STUD * )malloc(sizeof(struct STUD)); phead->next = NULL; phead = ReadLink(); } struct STUD *pnow = phead, *psave; printf("\t\t\t请输入要删除的学生学号:\n"); printf("\t\t\t"); scanf("%s", sID); rewind(stdin); while ( pnow->next != NULL ) { if (strcmp(pnow->next->data.ID, sID) == 0) { if (pnow->next->next == NULL) //如果指向最后一个结点为空 { psave = pnow->next; pnow->next = NULL; free(psave); psave = NULL; SaveLink(phead); return; } else { psave = pnow->next; pnow->next = psave->next; free(psave); psave = NULL; SaveLink(phead); printf("\n\t\t\t删除学号为%s的学生完成!\n\n", sID); printf("\n\t\t\t按任意键继续...\n\n"); printf("\n\t\t\t"); rewind(stdin); getchar(); return; } } pnow = pnow->next; } printf("\n\t\t\t学号为%s的学生不存在!\n\n", sID); printf("\n\t\t\t按任意键继续...\n\n"); printf("\n\t\t\t"); rewind(stdin); getchar(); } //查看学生成绩统计信息 void DisplayLink() { int num = -1; while ( 1 ) { system("cls"); num = menu1(); if (num < 0 || num > 5) { printf("\n\n\t\t\t 选择错误,请重新选择!\n"); printf("\n\n\t\t\t"); rewind(stdin); num = menu1(); } else { switch ( num ) { case 1: SortTotal(head); break; case 2: SortChinese(head); break; case 3: SortMath(head); break; case 4: SortEnglish(head); break; case 5: SortZh(head); break; case 0: return; break; } } } } //子菜单1 int menu1() { int choice = -1; system("Color f0"); printf("\n\t\t\t========================================\n"); printf("\t\t\t= 学生成绩统计信息 =\n"); printf("\t\t\t========================================\n"); printf("\t\t\t= 1. 按总分浏览 =\n"); printf("\t\t\t= 2. 按语文成绩 =\n"); printf("\t\t\t= 3. 按数学成绩 =\n"); printf("\t\t\t= 4. 按英语成绩 =\n"); printf("\t\t\t= 5. 按综合成绩 =\n"); printf("\t\t\t= 0. 返回主菜单 =\n"); printf("\t\t\t========================================\n"); printf("\n\n\t\t\t 请选择菜单选项: "); rewind(stdin); scanf("%d", &choice); return choice; } //按总分排序 void SortTotal(struct STUD *phead) { char s[20] = "总分"; SortNode(phead, s); return; } //按语文成绩排序 void SortChinese(struct STUD *phead) { char s[20] = "语文"; SortNode(phead, s); return; } //按数学成绩排序 void SortMath(struct STUD *phead) { char s[20] = "数学"; SortNode(phead, s); return; } //按英语成绩排序 void SortEnglish(struct STUD *phead) { char s[20] = "英语"; SortNode(phead, s); return; } //按综合成绩排序 void SortZh(struct STUD *phead) { char s[20] = "综合"; SortNode(phead, s); return; } //排序 void SortNode(struct STUD *phead, char *s) { if ( NULL == phead ) { phead = ( struct STUD * )malloc(sizeof(struct STUD)); phead->next = NULL; phead = ReadLink(); } struct STUD *move = phead->next; struct STUD *turn = phead->next; struct STUDENT buf; if ( NULL == move ) //说明输入的学生个数是0 { printf("\t\t\t学生成绩信息为空,程序终止!\n"); exit(-1); } while ( NULL != turn->next ) { while ( NULL != move->next ) { if ( strcmp(s, "总分") == 0 ) { if ( move->data.total < move->next->data.total ) { buf = move->data; move->data = move->next->data; move->next->data = buf; } } else if ( strcmp(s, "语文") == 0 ) { if ( move->data.chinese < move->next->data.chinese ) { buf = move->data; move->data = move->next->data; move->next->data = buf; } } else if ( strcmp(s, "数学") == 0 ) { if ( move->data.math < move->next->data.math ) { buf = move->data; move->data = move->next->data; move->next->data = buf; } } else if ( strcmp(s, "英语") == 0 ) { if ( move->data.english < move->next->data.english ) { buf = move->data; move->data = move->next->data; move->next->data = buf; } } else if ( strcmp(s, "综合") == 0 ) { if ( move->data.zh < move->next->data.zh ) { buf = move->data; move->data = move->next->data; move->next->data = buf; } } move = move->next; } move = phead->next; turn = turn->next; } OutputLink(phead); printf("\n\t\t\t按任意键继续...\n\n"); printf("\n\t\t\t"); rewind(stdin); getchar(); }
menu.c
#include "student.h" //菜单选项 void menu() { system("Color f0"); printf("\n\t\t\t========================================\n"); printf("\t\t\t= 学生成绩管理系统 =\n"); printf("\t\t\t========================================\n"); printf("\t\t\t= 1. 录入学生信息 =\n"); printf("\t\t\t= 2. 浏览学生信息 =\n"); printf("\t\t\t= 3. 查询学生信息 =\n"); printf("\t\t\t= 4. 添加学生信息 =\n"); printf("\t\t\t= 5. 删除学生信息 =\n"); printf("\t\t\t= 6. 查看统计信息 =\n"); printf("\t\t\t= 0. 退出系统 =\n"); printf("\t\t\t========================================\n"); printf("\n\n\t\t\t 请选择菜单选项: "); }
HeadNode.c
#include "student.h" struct STUD *head = NULL; int main(void) { struct STUD *phead = NULL; phead = head; int choice = -1; while ( 1 ) { system("cls"); menu(); scanf("%d", &choice); switch ( choice ) { case 1: phead = CreateLink(); break; case 2: ShowLink(phead); break; case 3: QueryLink(phead); break; case 4: AddNode(phead); break; case 5: DelNode(phead); break; case 6: DisplayLink(phead); break; case 0: exit(0); default: break; } } return 0; }
更多相关内容 -
学生成绩管理系统单链表实现
2020-09-04 10:32:24学生成绩管理程序 (使用c,go,python语言开发) 代码及版本管理地址 gitee码云版本地址(点击跳转) 要求 本程序用于教学单位(院/系)的学生成绩管理。要求程序能够实现学生信息录入(可以实现增加、删除、修改学生的...程序设计报告
题目
学生成绩管理程序 (使用c,go,python语言开发)
代码及版本管理地址
要求
本程序用于教学单位(院/系)的学生成绩管理。要求程序能够实现学生信息录入(可以实现增加、删除、修改学生的基本信息)、单科学习成绩的录入;班级内单科成绩排名;成绩查询:查询某个学生的各科成绩、统计所有不及格科目超过2科的学生名单。
设计思路
按照要求设计多种功能函数,并利用主函数实现功能,添加可视化操作提示。
数据结构
利用链式线性结构体Stu数据域存储学生信息,学生姓名、班级、年级、学生各科成绩为字符串型,学生编号为整型,指针域存储下一个指针地址。
流程图
功能及函数介绍
链表操作函数
(1)尾插法
void AddItem(Stu *plist) ;//尾插添加结点:传入需要添加结点的数量和头指针,从头指针遍历到尾结点,并从尾结点开始用malloc函数添加结点,添加完后将尾结点的指针域指向NULL
(2)遍历结点
Stu *NextItem(Stu *plist) ;//传入当前结点,传出下一结点
(3)链表初始化
Stu *InitList(int num);//初始化链表:利用malloc函数创建头指针,并将头指针编号为0,将头指针指针域指向NULL,并向后添加num个结点,并返回头指针
(4)寻找结点
Stu *SearchItem(int num,Stu *phead);//寻找结点:传入头指针,返回编号为num的结点位置
功能函数
(1)输出所有学生信息
void ShowItem(Stu *p_list,Stu *p_head);//传入指针,输出其数据域学生信息
(2) 初始化程序
void InitSys(Stu *p_head);//初始化学生系统后,管理员输入数据层
(3) 保存文件(二进制)
void SaveFile(Stu *p_head);//保存文件,用wb打开文件,并利用fwrite函数写入fwrite(1,2,3,4); 参数说明:1.要写入的数据的地址,2.一次要写多少字节,3.写多少次,4.写到哪里
(4) 学生总排名
int Sort(Stu *p_head,int n_ID,int n_subject) ;//院系总排名,传入头指针、学生编号、所要排名的数据类型,用SearchItem()函数检索该编号数据地址,并从头遍历链表到NULL,对每一个结点该数据值进行检索,遇到比被排序结点数值大时sum+1
(5)学生所在班级排名
int ClassSort(Stu *p_head,int n_ID,int n_subject) ;//班级排名,传入头指针、学生编号、所要排名的数据类型,同(4)类似,只是判断了班级是否相等,利用了strcmp()库函数,包含了<string.h>头文件
(6)查找学生
void Search(Stu *p_head,char *name); //搜索学生信息,传入头指针,传入学生姓名,遍历链表,找到该学生(考虑了重名情况)
(7)删除学生信息
void Del(Stu *p_head,int n_ID); //删除表,传入头指针,传入删除学生编号。用free()释放内存,包含头文件<stdlib>,并将前后结点相连,利用了SearchItem()函数找到3个结点地址
(8)将字符串转为double型
double Strtodouble(char *str) ;//传入0-100的字符串返回double型函数,若传入其他字符串,则返回-1。主要用于符合成绩逻辑,利用了atof()函数,包含头文件<stdlib>
(9)添加学生
void AddList(Stu *p_head) ;//尾部添加新同学
(10)修改学生信息
void Change(Stu *p_head);//修改学生信息,利用SearchItem()函数
(11)统计所有不及格科目超过2科的学生名单
void NoPass(Stu *p_head);//传入头指针,输出所有不及格科目超过2科的学生名单,从头开始遍历判断
(12)单科学习成绩的录入
void InputScore(Stu *start , Stu *end , Stu *p_head ,char *subject);//单科学习成绩录入,传入开始录入位置和结束录入位置,传入头指针 ,传入需要录入的学科
(13)保存文件(txt)
void Fprint(Stu *p_head);//将数据导出到当前路径下的StudentInformation.txt,导出为txt便于使用者阅读
(14)输出单个学生信息
void ShowItem(Stu *p_list,Stu *p_head) ;//传入结点地址,输出其数据域学生信息
(15)班级内单科成绩排名
void ClassSortOutput(Stu *p_head,char *str_class,int subject);//传入头指针,传入班级,传入学科 利用了桶排序思想
(16)插入学生
void Insert(Stu *p_head) ;//在中间插入一个表,找到前后结点,free()并将前中后结点关联,并将后续结点编号加一
功能测试(c语言)
(1)存在数据文件时对数据读取并进入主菜单
(2)不存在数据时初始化系统
(3)学生菜单
(4)管理员菜单(需输入密匙)
(5)输出所有学生信息
(6)查找学生
(7)输出两门以上不及格学生名单
(8)输出班级单科排名
(9)添加学生
(10)删除学生
(11)修改学生信息
(12)单科成绩录入
(13)插入学生
(14)保存为txt
遇到的问题和异常处理方法
(1)对输入int型变量的控制:
if(scanf("%d",&num)!=1) { printf("提示:你没有输入正确值,请重新输入:"); fflush(stdin);//while(getchar()!='\n'); }
能解决输入非int型变量时,程序崩溃问题
(2)对输入字符串的问题:
利用gets()函数输入,可以读入空格,防止缓冲区同时读入多个数据。
(3)
fflush(stdin);
读入int型等变量时会将换行符读入,利用这个函数可以将缓冲区换行符清除。Stdin指缓冲区
(4)对成绩判断问题:
while(Strtodouble(p_new->m_nMath) == -1) { printf("提示:您的输入有问题(成绩为0-100的整数),请重新输入:"); gets(p_new->m_nMath); }
利用Strtodouble函数对成绩输入判断,如果错误则重新输入
(5)对指针的判断:
遇到指针为NULL时,设置返回值,防止异常
联系方式
QQ773323518
-
C语言链表实现的学生成绩管理系统
2020-07-24 18:21:22用C语言链表实现的学生成绩管理系统,交互友好,包含录入、插入、修改成绩等大量功能,本作业成绩95+,包你满意 -
C语言基础篇02:单链表实现学生成绩管理系统
2021-11-22 10:41:34单链表实现学生成绩管理系统前言需求分析详细设计增加成绩信息删除成绩信息 前言 上篇已经讲过单链表的基本实现,这篇将以一个简单的管理系统入手。 详细讲解下如何在原来单链表的基础上实现一个简单的管理系统。 ...前言
上篇已经讲过单链表的基本实现,这篇将以一个简单的管理系统入手。 详细讲解下如何在原来单链表的基础上实现一个简单的管理系统。 上篇文章入口:[单链表的实现](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语言)
2022-07-01 15:55:071、实现软件:Dev-C++ 2、详细的测试页面可见我《资源》专栏下的《C语言系统资源测试》。 3、适合新手下载学习。 4、基于C语言的单链表实现。 5、代码共273行 6、注释多,排版有序 -
单链表学生成绩管理系统
2018-01-01 10:20:13编译环境vs2017 用单链表实现学生成绩管理系统 文件包含源代码和可执行文件 为以后算法与数据结构的同学提供帮助 -
C语言单链表版学生信息管理系统
2021-01-20 06:56:35//以单链表作为存储结构,设计和实现课程成绩管理的完整程序。 //程序包括如下功能。 //1.建立学生成绩表,包含学生的学号、姓名和成绩。 //2.可以显示所有学生成绩。 //3.可以计算学生的总数。 //4.可以按学号和... -
学生成绩管理系统(链表、C++)
2018-05-09 21:41:06使用单链表实现学生成绩管理系统,并以文件的形式打开和保存, 1.建立成绩表,实现增删改查功能, 2.按任一科排序 3.计算每名学生的平均成绩 4.统计不及格同学的人数,输出不及格的名单 5.统计平均成绩并排序,统计...
收藏数
1,241
精华内容
496