标签:style blog class code tar ext
上次我使用动态数组结构体实现了学生成绩管理系统: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 st PNODE等价于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 st PNODE等价于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》使用链表实现学生成绩管理系统,布布扣,bubuko.com
标签:style blog class code tar ext
原文地址:http://blog.csdn.net/u010105970/article/details/25058379