链表《5》使用链表实现学生成绩管理系统
来源:互联网 发布:网络赚钱项目有哪些 编辑:程序博客网 时间:2024/04/26 22:14
上次我使用动态数组结构体实现了学生成绩管理系统:http://blog.csdn.net/u010105970/article/details/17752193
这次学习了链表对链表也有所了解,我就想着用链表实现学生成绩管理系统,我的这个学生成绩管理系统和前一个的功能是一样的,只是实现的方法不同,因为使用链表实现对数据的增删改查不会引起大量数据的变化,所以效率上会有所提高
程序模块:
程序中使用到的函数:
函数名
函数功能
InputStudent
输入学生信息
OutputStudent
输出学生信息
DeleteStudent
删除学生信息
SearchStudent
查找学生信息
ChangeStudent
修改学生信息
InsertStudent
增加学生信息
ScortByChinese
对学生的语文成绩排序
ScortByMath
对学生的数学成绩排序
ScortByEnglish
对学生的英语成绩排序
ScortByTotal
对学生的总分排序
程序主界面:
功能选择界面:
首先定义一个学生结构和一个结点结构
学生结构:
struct Student//学生结构{char Name[10];//姓名int Age;//年龄int No;//学号float Score[3];//三科的成绩float Total;//总分float Ave;//平均分};
结点结构:
typedef struct Node//结点{struct Student st;//数据域struct Node *pNext;//指针域}NODE, *PNODE;/*NODE等价于struct Student stPNODE等价于struct Node *pNext*/
然后定义一些函数用于处理学生信息
函数名:PNODE InputStudent(void)
函数功能:输入学生信息
函数代码:
//输入函数,用于输入学生信息PNODE InputStudent(void){int len;//学生的人数NODE stu;//学生结构//定义一个头结点并且为头结点分配内存PNODE pHead = (PNODE)malloc(sizeof(NODE));//判断内存是否为空if(NULL == pHead){printf("内存分配失败,程序终止!\n");exit(-1);}//定义一个指向头结点的指针PNODE pTail = pHead;pTail->pNext = NULL;//清空指针域printf("请输入学生的人数:");scanf("%d",&len);for(int i=0; i<len; i++){system("cls");//清屏printf("请输入第%d个学生的姓名:", i+1);scanf("%s", stu.st.Name);printf("请输入第%d个学生的年龄:", i+1);scanf("%d", &stu.st.Age);printf("请输入第%d个学生的学号:", i+1);scanf("%d", &stu.st.No);printf("请输入第%d个学生的语文成绩:", i+1);scanf("%f", &stu.st.Score[0]);printf("请输入第%d个学生的数学成绩:", i+1);scanf("%f", &stu.st.Score[1]);printf("请输入第%d个学生的英语成绩:", i+1);scanf("%f", &stu.st.Score[2]);//计算总分stu.st.Total = stu.st.Score[0] + stu.st.Score[1] + stu.st.Score[2];//计算平均分stu.st.Ave = stu.st.Total / 3.0f;//为新节点分配内存PNODE pNew = (PNODE)malloc(sizeof(NODE));//判断内存是否为空if(NULL == pNew){printf("内存分配失败,程序终止!\n");exit(-1);}//初始化结点的数据域pNew->st = stu.st;//将新结点挂到老结点后pTail->pNext = pNew;//清空新结点的指针域pNew->pNext = NULL;//将pTail移到新结点上pTail = pNew;}return pHead;}
实现效果:
输入学生的人数:
输入第1个学生的信息
输入第2个学生的信息:
函数名:void OutputStudent(PNODE pHead)
函数功能:输出学生信息
函数代码:
//输出学生信息void OutputStudent(PNODE pHead){//定义一个指针用于遍历学生信息PNODE p = pHead->pNext;printf("姓名 年龄 学号 语文 数学 英语 总分 平均分\n");while(NULL != p){printf("%s %d %d %g %g %g %g %g\n", p->st.Name, p->st.Age, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);p = p->pNext;}}
测试程序:
函数名:void DeleteStudent(PNODE pHead)
函数功能:删除学生信息
函数代码:
//删除学生信息void DeleteStudent(PNODE pHead){PNODE p = pHead;int i = 0;int pos;printf("请输入你需要删除的学生的编号:");scanf("%d",&pos);while(NULL != p->pNext && i<pos-1){p = p->pNext;i++;}if(NULL == p->pNext || i>pos-1){printf("没找到需要删除的学生的编号!\n");return;}PNODE q = p->pNext;p->pNext = q->pNext;free(q);q == NULL;printf("你已经成功删除了第%d个学生的信息!\n",pos);}
测试程序:
选择需要删除的学生的编号
删除成功的标志:
删除后的学生信息:
函数名:void SearchStudent(PNODE pHead)
函数功能:查找学生信息
函数代码:
//查找学生信息void SearchStudent(PNODE pHead){char Name[10];printf("请输入你需要查找的学生的姓名:");scanf("%s",Name);PNODE p = pHead->pNext;while(NULL != p){if(0 == strcmp(Name,p->st.Name)){printf("%s %d %d %g %g %g %g %g\n",p->st.Name, p->st.Age, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);}p = p->pNext;}}
测试程序:
查找李四的信息
函数名:void ChangeStudent(PNODE pHead)
函数功能:修改学生信息
函数代码
//修改学生信息void ChangeStudent(PNODE pHead){char Name[10];printf("请输入你需要修改的学生的姓名:");scanf("%s",&Name);PNODE p = pHead->pNext;//定义一个指针用于遍历学生信息while(NULL != p){if(0 == strcmp(Name, p->st.Name)){printf("姓名 年龄 学号 语文 数学 英语 总分 平均分\n");printf("修改前的学生信息!\n");printf("%s %d %d %g %g %g %g %g\n",p->st.Name, p->st.Age, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);system("pause");system("cls");//清屏printf("请输入新的学生姓名:");scanf("%s", p->st.Name);printf("请输入新的学生年龄:");scanf("%d", &p->st.Age);printf("请输入新的学生学号:");scanf("%d", &p->st.No);printf("请输入新的学生的语文成绩:");scanf("%f", &p->st.Score[0]);printf("请输入新的学生的数学成绩:");scanf("%f", &p->st.Score[1]);printf("请输入新的学生的英语成绩:");scanf("%f", &p->st.Score[2]);//计算总分p->st.Total = p->st.Score[0] + p->st.Score[1] + p->st.Score[2];//计算平均分p->st.Ave = p->st.Total / 3.0f;break;}p = p->pNext;}}
测试程序:
修改前李四的成绩
修改李四的成绩
修改后李四的成绩:
函数名:void InsertStudent(PNODE pHead)
函数功能:增加学生信息
函数代码:
//增加学生信息void InsertStudent(PNODE pHead){PNODE p = pHead;int i = 0;struct Student stu;//学生结构int pos;//插入结点的位置printf("请输入插入学生的位置:");scanf("%d",&pos);while(NULL != p && i<pos-1){p = p->pNext;i++;}if(NULL == p || i>pos){printf("插入结点的位置不存在!\n");return;}printf("你将在第%d个学生后面插入一个学生\n",pos-1);printf("请输入第%d个学生的姓名:",pos);scanf("%s",stu.Name);printf("请输入第%d个学生的年龄:",pos);scanf("%d",&stu.Age);printf("请输入第%d个学生的学号:",pos);scanf("%d",&stu.No);printf("请输入第%d个学生的语文成绩:",pos);scanf("%f",&stu.Score[0]);printf("请输入第%d个学生的数学成绩:",pos);scanf("%f",&stu.Score[1]);printf("请输入第%d个学生的英语成绩:",pos);scanf("%f",&stu.Score[2]);//计算总分stu.Total = stu.Score[0] + stu.Score[1] + stu.Score[2];//计算平均分stu.Ave = stu.Total / 3.0f;PNODE pNew = (PNODE)malloc(sizeof(NODE));if(NULL == pNew){printf("动态内存分配失败,程序终止!\n");exit(-1);}pNew->st = stu;PNODE q = p->pNext;p->pNext = pNew;pNew->pNext = q;}
测试程序:
增加王五的信息
增加后的效果:
函数名:void ScortByChinese(PNODE pHead)
函数功能:对学生的语文成绩排序
函数代码:
//对学生的语文成绩排序void ScortByChinese(PNODE pHead){PNODE p, q;//定义两个指针NODE temp;for(p=pHead->pNext; NULL != p; p=p->pNext){for(q=p->pNext; NULL !=q; q=q->pNext){if(p->st.Score[0] < q->st.Score[0])//当前一个学生的语文成绩小于后一个学生的语文成绩时{temp.st = p->st;//交换学生的位置p->st = q->st;q->st = temp.st;}}}}
测试程序:
排序前的学生信息
排序后的学生信息:
//对学生的数学成绩排序void ScortByMath(PNODE pHead){PNODE p, q;//定义两个指针NODE temp;for(p=pHead->pNext; NULL != p; p=p->pNext){for(q=p->pNext; NULL !=q; q=q->pNext){if(p->st.Score[1] < q->st.Score[1])//当前一个学生的数学成绩小于后一个学生的数学成绩时{temp.st = p->st;//交换学生的位置p->st = q->st;q->st = temp.st;}}}}
测试程序:
//对学生的英语成绩排序void ScortByEnglish(PNODE pHead){PNODE p, q;//定义两个指针NODE temp;for(p=pHead->pNext; NULL != p; p=p->pNext){for(q=p->pNext; NULL !=q; q=q->pNext){if(p->st.Score[2] < q->st.Score[2])//当前一个学生的英语成绩小于后一个学生的英语成绩时{temp.st = p->st;//交换学生的位置p->st = q->st;q->st = temp.st;}}}}
//对学生的总分排序void ScortByTotal(PNODE pHead){PNODE p, q;//定义两个指针NODE temp;for(p=pHead->pNext; NULL != p; p=p->pNext){for(q=p->pNext; NULL !=q; q=q->pNext){if(p->st.Total < q->st.Total)//当前一个学生的总分小于后一个学生的总分时{temp.st = p->st;//交换学生的位置p->st = q->st;q->st = temp.st;}}}}
测试程序:
#include <stdio.h>#include <stdlib.h>#include <string.h>struct Student//学生结构{char Name[10];//姓名int Age;//年龄int No;//学号float Score[3];//三科的成绩float Total;//总分float Ave;//平均分};typedef struct Node//结点{struct Student st;//数据域struct Node *pNext;//指针域}NODE, *PNODE;/*NODE等价于struct Student stPNODE等价于struct Node *pNext*///输入函数,用于输入学生信息PNODE InputStudent(void);//输出学生信息void OutputStudent(PNODE pHead);//删除学生信息void DeleteStudent(PNODE pHead);//查找学生信息void SearchStudent(PNODE pHead);//修改学生信息void ChangeStudent(PNODE pHead);//增加学生信息void InsertStudent(PNODE pHead);//对学生的语文成绩排序void ScortByChinese(PNODE pHead);//对学生的数学成绩排序void ScortByMath(PNODE pHead);//对学生的英语成绩排序void ScortByEnglish(PNODE pHead);//对学生的总分排序void ScortByTotal(PNODE pHead);void main(){printf("================================================================================\n\n");printf("================================================================================\n\n");printf("*************************欢迎使用学生成绩管理系统*******************************\n\n");printf("-----------------------------------------------------------------制作人:梅沙小子\n\n");printf("********************************************************************************\n\n");printf("================================================================================\n\n");printf("请按任意将进入学生管理系统:\n");getchar();system("cls");printf("================================================================================\n\n");printf("------------------------ 请选择要操作的命令:-----------------------------------\n\n");printf("-------------------------- 1 输入学生信息--------------------------------------\n\n");printf("-------------------------- 2 输出学生信息--------------------------------------\n\n");printf("-------------------------- 3 删除学生信息--------------------------------------\n\n");printf("-------------------------- 4 查找学生信息--------------------------------------\n\n");printf("-------------------------- 5 修改学生信息--------------------------------------\n\n");printf("-------------------------- 6 增加学生信息--------------------------------------\n\n");printf("-------------------------- 7 将学生的语文成绩按从大到小排----------------------\n\n");printf("-------------------------- 8 将学生的数学成绩按从大到小排----------------------\n\n");printf("-------------------------- 9 将学生的英语成绩按从大到小排----------------------\n\n"); printf("-------------------------- 10 将学生的总成绩按从大到小排------------------------\n\n");printf("================================================================================\n\n");int Item;//保存操作命令PNODE pHead = NULL;//定义一个指针while(1){printf("请选择操作命令:");scanf("%d",&Item);system("cls");//清屏switch(Item){ case 1://输入学生信息{pHead = InputStudent();}break;case 2://输出学生信息{OutputStudent(pHead);}break;case 3://删除学生信息{DeleteStudent(pHead);}break;case 4://查找学生信息{SearchStudent(pHead);}break;case 5://修改学生信息{ChangeStudent(pHead);}break;case 6://增加学生信息{InsertStudent(pHead);}break;case 7://对学生的语文成绩排序{ScortByChinese(pHead);OutputStudent(pHead);}break;case 8://对学生的数学成绩排序{ScortByMath(pHead);OutputStudent(pHead);}break;case 9://对学生的英语成绩排序{ScortByEnglish(pHead);OutputStudent(pHead);}break;case 10://对学生的总分排序{ScortByTotal(pHead);OutputStudent(pHead);}break;default:break;}}system("pause");}//输入函数,用于输入学生信息PNODE InputStudent(void){int len;//学生的人数NODE stu;//学生结构//定义一个头结点并且为头结点分配内存PNODE pHead = (PNODE)malloc(sizeof(NODE));//判断内存是否为空if(NULL == pHead){printf("内存分配失败,程序终止!\n");exit(-1);}//定义一个指向头结点的指针PNODE pTail = pHead;pTail->pNext = NULL;//清空指针域printf("请输入学生的人数:");scanf("%d",&len);for(int i=0; i<len; i++){system("cls");//清屏printf("请输入第%d个学生的姓名:", i+1);scanf("%s", stu.st.Name);printf("请输入第%d个学生的年龄:", i+1);scanf("%d", &stu.st.Age);printf("请输入第%d个学生的学号:", i+1);scanf("%d", &stu.st.No);printf("请输入第%d个学生的语文成绩:", i+1);scanf("%f", &stu.st.Score[0]);printf("请输入第%d个学生的数学成绩:", i+1);scanf("%f", &stu.st.Score[1]);printf("请输入第%d个学生的英语成绩:", i+1);scanf("%f", &stu.st.Score[2]);//计算总分stu.st.Total = stu.st.Score[0] + stu.st.Score[1] + stu.st.Score[2];//计算平均分stu.st.Ave = stu.st.Total / 3.0f;//为新节点分配内存PNODE pNew = (PNODE)malloc(sizeof(NODE));//判断内存是否为空if(NULL == pNew){printf("内存分配失败,程序终止!\n");exit(-1);}//初始化结点的数据域pNew->st = stu.st;//将新结点挂到老结点后pTail->pNext = pNew;//清空新结点的指针域pNew->pNext = NULL;//将pTail移到新结点上pTail = pNew;}return pHead;}//输出学生信息void OutputStudent(PNODE pHead){//定义一个指针用于遍历学生信息PNODE p = pHead->pNext;printf("姓名 年龄 学号 语文 数学 英语 总分 平均分\n");while(NULL != p){printf("%s %d %d %g %g %g %g %g\n", p->st.Name, p->st.Age, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);p = p->pNext;}}//删除学生信息void DeleteStudent(PNODE pHead){PNODE p = pHead;int i = 0;int pos;printf("请输入你需要删除的学生的编号:");scanf("%d",&pos);while(NULL != p->pNext && i<pos-1){p = p->pNext;i++;}if(NULL == p->pNext || i>pos-1){printf("没找到需要删除的学生的编号!\n");return;}PNODE q = p->pNext;p->pNext = q->pNext;free(q);q == NULL;printf("你已经成功删除了第%d个学生的信息!\n",pos);}//查找学生信息void SearchStudent(PNODE pHead){char Name[10];printf("请输入你需要查找的学生的姓名:");scanf("%s",Name);PNODE p = pHead->pNext;while(NULL != p){if(0 == strcmp(Name,p->st.Name)){printf("%s %d %d %g %g %g %g %g\n",p->st.Name, p->st.Age, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);}p = p->pNext;}}//修改学生信息void ChangeStudent(PNODE pHead){char Name[10];printf("请输入你需要修改的学生的姓名:");scanf("%s",&Name);PNODE p = pHead->pNext;//定义一个指针用于遍历学生信息while(NULL != p){if(0 == strcmp(Name, p->st.Name)){printf("姓名 年龄 学号 语文 数学 英语 总分 平均分\n");printf("修改前的学生信息!\n");printf("%s %d %d %g %g %g %g %g\n",p->st.Name, p->st.Age, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);system("pause");system("cls");//清屏printf("请输入新的学生姓名:");scanf("%s", p->st.Name);printf("请输入新的学生年龄:");scanf("%d", &p->st.Age);printf("请输入新的学生学号:");scanf("%d", &p->st.No);printf("请输入新的学生的语文成绩:");scanf("%f", &p->st.Score[0]);printf("请输入新的学生的数学成绩:");scanf("%f", &p->st.Score[1]);printf("请输入新的学生的英语成绩:");scanf("%f", &p->st.Score[2]);//计算总分p->st.Total = p->st.Score[0] + p->st.Score[1] + p->st.Score[2];//计算平均分p->st.Ave = p->st.Total / 3.0f;break;}p = p->pNext;}}//增加学生信息void InsertStudent(PNODE pHead){PNODE p = pHead;int i = 0;struct Student stu;//学生结构int pos;//插入结点的位置printf("请输入插入学生的位置:");scanf("%d",&pos);while(NULL != p && i<pos-1){p = p->pNext;i++;}if(NULL == p || i>pos){printf("插入结点的位置不存在!\n");return;}printf("你将在第%d个学生后面插入一个学生\n",pos-1);printf("请输入第%d个学生的姓名:",pos);scanf("%s",stu.Name);printf("请输入第%d个学生的年龄:",pos);scanf("%d",&stu.Age);printf("请输入第%d个学生的学号:",pos);scanf("%d",&stu.No);printf("请输入第%d个学生的语文成绩:",pos);scanf("%f",&stu.Score[0]);printf("请输入第%d个学生的数学成绩:",pos);scanf("%f",&stu.Score[1]);printf("请输入第%d个学生的英语成绩:",pos);scanf("%f",&stu.Score[2]);//计算总分stu.Total = stu.Score[0] + stu.Score[1] + stu.Score[2];//计算平均分stu.Ave = stu.Total / 3.0f;PNODE pNew = (PNODE)malloc(sizeof(NODE));if(NULL == pNew){printf("动态内存分配失败,程序终止!\n");exit(-1);}pNew->st = stu;PNODE q = p->pNext;p->pNext = pNew;pNew->pNext = q;}//对学生的语文成绩排序void ScortByChinese(PNODE pHead){PNODE p, q;//定义两个指针NODE temp;for(p=pHead->pNext; NULL != p; p=p->pNext){for(q=p->pNext; NULL !=q; q=q->pNext){if(p->st.Score[0] < q->st.Score[0])//当前一个学生的语文成绩小于后一个学生的语文成绩时{temp.st = p->st;//交换学生的位置p->st = q->st;q->st = temp.st;}}}}//对学生的数学成绩排序void ScortByMath(PNODE pHead){PNODE p, q;//定义两个指针NODE temp;for(p=pHead->pNext; NULL != p; p=p->pNext){for(q=p->pNext; NULL !=q; q=q->pNext){if(p->st.Score[1] < q->st.Score[1])//当前一个学生的数学成绩小于后一个学生的数学成绩时{temp.st = p->st;//交换学生的位置p->st = q->st;q->st = temp.st;}}}}//对学生的英语成绩排序void ScortByEnglish(PNODE pHead){PNODE p, q;//定义两个指针NODE temp;for(p=pHead->pNext; NULL != p; p=p->pNext){for(q=p->pNext; NULL !=q; q=q->pNext){if(p->st.Score[2] < q->st.Score[2])//当前一个学生的英语成绩小于后一个学生的英语成绩时{temp.st = p->st;//交换学生的位置p->st = q->st;q->st = temp.st;}}}}//对学生的总分排序void ScortByTotal(PNODE pHead){PNODE p, q;//定义两个指针NODE temp;for(p=pHead->pNext; NULL != p; p=p->pNext){for(q=p->pNext; NULL !=q; q=q->pNext){if(p->st.Total < q->st.Total)//当前一个学生的总分小于后一个学生的总分时{temp.st = p->st;//交换学生的位置p->st = q->st;q->st = temp.st;}}}}
- 链表《5》使用链表实现学生成绩管理系统
- 学生成绩管理系统链表实现
- 学生成绩管理系统(链表的实现)
- 学生成绩管理系统的链表实现
- 使用C++结合文件操作和链表实现学生成绩管理系统
- C语言链表实现的简易学生成绩管理系统
- 学生成绩管理系统课程设计(C语言,链表实现)
- c++链表实现学生成绩管理系统(简易版)
- 类实现学生成绩管理系统
- 成绩管理系统链表实现
- c链表 学生成绩管理系统
- 学生成绩管理系统 C语言链表版本
- 基于动态链表的学生成绩管理系统
- c语言链表-学生成绩管理系统
- 基于链表的学生成绩管理系统
- C_综合使用数组实现简单的学生成绩管理系统
- 用文件实现学生成绩管理系统
- 学生成绩管理系统 c语言实现
- 隐藏在背后的交互设计
- herf js 提示
- Leetcode_Rotate Image
- rosserial_embeddedlinux编译
- Easyui 用datagrid 查询数据
- 链表《5》使用链表实现学生成绩管理系统
- javascript jquery基本用法 增删改查
- 测试类型和说明
- 怎么利用wireshark人为制造丢包情况
- 如何使用google的日志库(glog)
- 如何恢复工作中清除的照片
- Java 学习笔记之 ByteBuffer
- 浅析JAVA设计模式之代理模式(四)
- Eclipse + CDT 实现JNI 的方法