【单链表实现】学生管理系统(缺少文件输入输出流)
2015-11-28 21:23
363 查看
本篇博文结合学过的数据结构单链表的知识,来实现一个学生管理系统的创建,仍有不完善的地方,望大家指出,对于文件输入输出流,会在后续添加。
详细代码如下:
Garde.h
main.cpp
详细代码如下:
Garde.h
<strong><span style="font-size:18px;">#pragma once #pragma warning(disable:4996) #include <iostream> #include <string.h> #include <stdio.h> #include <assert.h> #include <stdlib.h> using namespace std; class Student; typedef enum{FALSE,TRUE} Status; typedef struct Data { char num[20]; char name[20]; int Cgrade; int Mgrade; int Egrade; int Total; char CRank; char ERank; char MRank; }Data; class Node { friend class Student; public: Node():next(NULL) {} Node(Data d) :data (d),next(NULL) {} ~Node() {} private: Data data; Node *next; }; class Student { public: Student() { Node *s = new Node(); strcpy(s->data.name, "\0"); strcpy(s->data.num, "\0"); s->data.Cgrade = 0; s->data.Mgrade = 0; s->data.Egrade = 0; s->data.CRank = '0'; s->data.MRank = '0'; s->data.ERank = '0'; s->data.Total = 0; first = last = s; last->next = NULL; size = 0; } ~Student() { Clear(); delete first; delete last; } Status CreateStudent(Data d[], int n) { if (n < 0) { return FALSE; } for (int i = 0; i < n; ++i) { Node *s = new Node(); strcpy(s->data.name, d[i].name); strcpy(s->data.num, d[i].num); s->data.Cgrade = d[i].Cgrade; s->data.Mgrade = d[i].Mgrade; s->data.Egrade = d[i].Egrade; s->data.Total = d[i].Cgrade + d[i].Egrade + d[i].Mgrade; s->data.CRank = d[i].CRank; s->data.MRank = d[i].MRank; s->data.ERank = d[i].ERank; last ->next = s; last = s; size++; } return TRUE; } void T_Sort()//截断法 { if (size == 0 || size == 1) { return; } Node * p = first->next; Node * q = p->next; last = p; last->next = NULL; while (q != NULL) { p = q; q = q->next; Node * s = first; while (p->data.Total < s->next->data.Total &&s->next != NULL) { s = s->next; } if (s->next == NULL) { p->next = NULL; last->next = NULL; last = p; } else { p->next = s->next; s->next = p; } } } void C_Sort() { if (size == 0 || size == 1) { return; } Node * p = first->next; Node * q = p->next; last = p; last->next = NULL; while (q != NULL) { p = q; q = q->next; Node * s = first; while (p->data.Total < s->next->data.Total &&s->next != NULL) { s = s->next; } if (s->next == NULL) { p->next = NULL; last->next = NULL; last = p; } else { p->next = s->next; s->next = p; } } } void E_Sort() { if (size == 0 || size == 1) { return; } Node * p = first->next; Node * q = p->next; last = p; last->next = NULL; while (q != NULL) { p = q; q = q->next; Node * s = first; while (p->data.Total < s->next->data.Total &&s->next != NULL) { s = s->next; } if (s->next == NULL) { p->next = NULL; last->next = NULL; last = p; } else { p->next = s->next; s->next = p; } } } void M_Sort() { if (size == 0 || size == 1) { return; } Node * p = first->next; Node * q = p->next; last = p; last->next = NULL; while (q != NULL) { p = q; q = q->next; Node * s = first; while (p->data.Mgrade < s->next->data.Mgrade &&s->next != NULL) { s = s->next; } if (s->next == NULL) { p->next = NULL; last->next = NULL; last = p; } else { p->next = s->next; s->next = p; } } } Status T_InsertStudent(Data d) { Node * p = first; Node * q = p->next; if (q->data.Total > d.Total && q != NULL) { q = q->next; p = p->next; } Node *s = new Node(); strcpy(s->data.num, d.num); strcpy(s->data.name, d.name); s->data.Cgrade = d.Cgrade; s->data.CRank = d.CRank; s->data.Mgrade = d.Mgrade; s->data.MRank = d.MRank; s->data.Egrade = d.Egrade; s->data.ERank = d.ERank; s->data.Total = d.Total; if (q == NULL) { last->next = s; last = s; last->next = NULL; } else { s->next = p->next; p->next = s; } size++; return TRUE; } Status E_InsertStudent(Data d) { Node * p = first; Node * q = p->next; if (q->data.Egrade > d.Egrade && q != NULL) { q = q->next; p = p->next; } Node *s = new Node(); strcpy(s->data.num, d.num); strcpy(s->data.name, d.name); s->data.Cgrade = d.Cgrade; s->data.CRank = d.CRank; s->data.Mgrade = d.Mgrade; s->data.MRank = d.MRank; s->data.Egrade = d.Egrade; s->data.ERank = d.ERank; s->data.Total = d.Total; if (q == NULL) { last->next = s; last = s; last->next = NULL; } else { s->next = p->next; p->next = s; } size++; return TRUE; } Status M_InsertStudent(Data d) { Node * p = first; Node * q = p->next; if (q->data.Mgrade > d.Mgrade && q != NULL) { q = q->next; p = p->next; } Node *s = new Node(); strcpy(s->data.num, d.num); strcpy(s->data.name, d.name); s->data.Cgrade = d.Cgrade; s->data.CRank = d.CRank; s->data.Mgrade = d.Mgrade; s->data.MRank = d.MRank; s->data.Egrade = d.Egrade; s->data.ERank = d.ERank; s->data.Total = d.Total; if (q == NULL) { last->next = s; last = s; last->next = NULL; } else { s->next = p->next; p->next = s; } size++; return TRUE; } Status C_InsertStudent(Data d) { Node * p = first; Node * q = p->next; if (q->data.Cgrade > d.Cgrade && q != NULL) { q = q->next; p = p->next; } Node *s = new Node(); strcpy(s->data.num, d.num); strcpy(s->data.name, d.name); s->data.Cgrade = d.Cgrade; s->data.CRank = d.CRank; s->data.Mgrade = d.Mgrade; s->data.MRank = d.MRank; s->data.Egrade = d.Egrade; s->data.ERank = d.ERank; s->data.Total = d.Total; if (q == NULL) { last->next = s; last = s; last->next = NULL; } else { s->next = p->next; p->next = s; } size++; return TRUE; } Node * Find(char num[]) { assert(num != NULL); Node * p = first; while ( p->next->data.num != num && p->next != NULL ) { p = p->next; } if(strcmp(p->data.num ,num) == 0) { return p; } return NULL; } Node *Pre(char num[]) { assert(num != NULL); Node * p = first; Node * s = Find(num); if (s == NULL) { return NULL; } while (p->next != s) { p = p->next; } return p; } Status Delete(char num[]) { assert(num != NULL); Node * p = Find(num); Node * pre = Pre(num); if (pre == NULL || p == NULL) { return FALSE; } pre->next = p->next; if (p->next == NULL) { last = pre; } size--; return TRUE; } Status Modify(char num[]) { int number; assert(num != NULL); Node * s = Find(num); if (s == NULL) { return FALSE; } cout << "请选取需修改的内容:" << endl; cout << "*********************************" << endl; cout << "**1.Chinese 2.Math **" << endl; cout << "**3.English 4.Name **" << endl; cout << "*********************************" << endl; cin >> number; switch (number) { case 1: int score; cout << "请输入修改后的值:"; cin >> score; s->data.Cgrade = score; if (s->data.Cgrade < 60) { s->data.CRank = 'E'; } if (s->data.Cgrade < 70 && s->data.Cgrade >= 60) { s->data.CRank = 'D'; } if (s->data.Cgrade < 80 && s->data.Cgrade >= 70) { s->data.CRank = 'C'; } if (s->data.Cgrade < 90 && s->data.Cgrade >= 80) { s->data.CRank = 'B'; } if (s->data.Cgrade >= 90) { s->data.CRank = 'A'; } s->data.Total = s->data.Cgrade + s->data.Egrade + s->data.Mgrade; break; case 2: cout << "请输入修改后的值:"; cin >> score; s->data.Mgrade = score; if (s->data.Mgrade < 60) { s->data.MRank = 'E'; } if (s->data.Mgrade < 70 && s->data.Mgrade >= 60) { s->data.MRank = 'D'; } if (s->data.Mgrade < 80 && s->data.Mgrade >= 70) { s->data.MRank = 'C'; } if (s->data.Mgrade < 90 && s->data.Mgrade >= 80) { s->data.MRank = 'B'; } if (s->data.Mgrade >= 90) { s->data.MRank = 'A'; } s->data.Total = s->data.Cgrade + s->data.Egrade + s->data.Mgrade; break; case 3: cout << "请输入修改后的值:"; cin >> score; s->data.Egrade = score; if (s->data.Egrade < 60) { s->data.ERank = 'E'; } if (s->data.Egrade < 70 && s->data.Egrade >= 60) { s->data.ERank = 'D'; } if (s->data.Egrade < 80 && s->data.Egrade >= 70) { s->data.ERank = 'C'; } if (s->data.Egrade < 90 && s->data.Egrade >= 80) { s->data.ERank = 'B'; } if (s->data.Egrade >= 90) { s->data.ERank = 'A'; } s->data.Total = s->data.Cgrade + s->data.Egrade + s->data.Mgrade; break; case 4: char str[20]; cout << "请输入修改后的值:"; cin >> str; strcpy(s->data.name, str); break; default: break; } return TRUE; } void Show() { Node * p = first->next; while (p != NULL) { cout << p->data.num << " " << p->data.name << " " << p->data.Cgrade << " " << p->data.CRank << " " << p->data.Mgrade << " " << p->data.MRank << " " << p->data.Egrade << " " << p->data.ERank << " " << p->data.Total << endl; p = p->next; } } int length() { return size; } void Clear() { Node *p = first->next; while (p != NULL) { first->next = p->next; delete p; p = p->next; } last = first; size = 0; } Status Delete() { return TRUE; } private: Node * first; Node * last; size_t size; }; </span></strong>
main.cpp
<strong><span style="font-size:18px;">#include "Grade.h" int main() { int select = 1; int num = -1; Student stu; Data data; while (select) { cout << " *********************学生成绩管理系统********************\n"; cout << " ** 1.CreateStudent 2.InsertStudent **\n"; cout << " ** 3.SortStudent 4.ShowStudent **\n"; cout << " ** 5.ModifyStudent 6.DeleteStudent **\n"; cout << " ** 7.Clear 8.Number **\n"; cout << " ** 0.Quit **\n"; cout << " *********************************************************\n"; cout << "请输入所选操作:"; cin >> select; switch (select) { case 1: cout << "请输入学生个数:"; int N; cin >> N; Data d[100]; cout << "请输入每个学生学号、姓名、语数英三科成绩:\n"; for (int i = 0; i < N; ++i) { cin >> d[i].num >> d[i].name >> d[i].Cgrade >> d[i].Mgrade >> d[i].Egrade; d[i].Total = d[i].Cgrade + d[i].Egrade + d[i].Mgrade; if (d[i].Cgrade < 60) { d[i].CRank = 'E'; } if (d[i].Cgrade < 70 && d[i].Cgrade >= 60) { d[i].CRank = 'D'; } if (d[i].Cgrade < 80 && d[i].Cgrade >= 70) { d[i].CRank = 'C'; } if (d[i].Cgrade < 90 && d[i].Cgrade >= 80) { d[i].CRank = 'B'; } if (d[i].Cgrade >= 90) { d[i].CRank = 'A'; } if (d[i].Egrade < 60) { d[i].ERank = 'E'; } if (d[i].Egrade < 70 && d[i].Egrade >= 60) { d[i].ERank = 'D'; } if (d[i].Egrade < 80 && d[i].Egrade >= 70) { d[i].ERank = 'C'; } if (d[i].Egrade < 90 && d[i].Egrade >= 80) { d[i].ERank = 'B'; } if (d[i].Egrade >= 90) { d[i].ERank = 'A'; } if (d[i].Mgrade < 60) { d[i].MRank = 'E'; } if (d[i].Mgrade < 70 && d[i].Mgrade >= 60) { d[i].MRank = 'D'; } if (d[i].Mgrade < 80 && d[i].Mgrade >= 70) { d[i].MRank = 'C'; } if (d[i].Mgrade < 90 && d[i].Mgrade >= 80) { d[i].MRank = 'B'; } if (d[i].Mgrade >= 90) { d[i].MRank = 'A'; } } stu.CreateStudent(d, N); break; case 2: cout << "请输入所插入学生信息:" << endl; cin >> data.num >> data.name >> data.Cgrade >> data.Mgrade >> data.Egrade; data.Total = data.Cgrade + data.Egrade + data.Mgrade; if (data.Cgrade < 60) { data.CRank = 'E'; } if (data.Cgrade < 70 && data.Cgrade >= 60) { data.CRank = 'D'; } if (data.Cgrade < 80 && data.Cgrade >= 70) { data.CRank = 'C'; } if (data.Cgrade < 90 && data.Cgrade >= 80) { data.CRank = 'B'; } if (data.Cgrade >= 90) { data.CRank = 'A'; } if (data.Egrade < 60) { data.ERank = 'E'; } if (data.Egrade < 70 && data.Egrade >= 60) { data.ERank = 'D'; } if (data.Egrade < 80 && data.Egrade >= 70) { data.ERank = 'C'; } if (data.Egrade < 90 && data.Egrade >= 80) { data.ERank = 'B'; } if (data.Egrade >= 90) { data.ERank = 'A'; } if (data.Mgrade < 60) { data.MRank = 'E'; } if (data.Mgrade < 70 && data.Mgrade >= 60) { data.MRank = 'D'; } if (data.Mgrade < 80 && data.Mgrade >= 70) { data.MRank = 'C'; } if (data.Mgrade < 90 && data.Mgrade >= 80) { data.MRank = 'B'; } if (data.Mgrade >= 90) { data.MRank = 'A'; } cout << endl; cout << "*************************************" << endl; cout << "**1.Total_Insert 2.Chinese_Insert**" << endl; cout << "**3.Math_Insert 4.English_Insert**" << endl; cout << "*************************************" << endl; cout << "请选取插入方式:"; cin >> num; switch (num) { case 1: stu.T_InsertStudent(data); break; case 2: stu.C_InsertStudent(data); break; case 3: stu.M_InsertStudent(data); break; case 4: stu.E_InsertStudent(data); break; default: break; } break; case 3: cout << endl; cout << "*********************************" << endl; cout << "**1.Total_Sort 2.Chinese_Sort**" << endl; cout << "**3.Math_Sort 4.English_Sort**" << endl; cout << "*********************************" << endl; cout << "请选取排序方式:"; cin >> num; switch (num) { case 1: stu.T_Sort(); break; case 2: stu.C_Sort(); break; case 3: stu.M_Sort(); break; case 4: stu.E_Sort(); break; default: break; } break; case 4: stu.Show(); break; case 5: cout << "请输入要修改的学生的学号:"; cin >> data.num; stu.Modify(data.num); break; case 6: cout << "请输入删除学生学号:"; cin >> data.num; stu.Delete(data.num); break; case 7: stu.Clear(); break; case 8: cout << "记录学生数目:"<< stu.length() << endl; break; case 0: break; default: break; } } return 0; }</span></strong>
相关文章推荐
- 全功能智能车之CCD增加自适应光照能力(第十三篇)
- 程序猿进化必读:让App的运行速度与响应速度趋于一流(iOS)
- 关于文本编辑器的推荐
- Java、Hibernate(JPA)注解大全
- 网页设计大赛第十天
- 从今天开始学习ios,入门第二天(Object-C学习笔记)内存管理
- 音乐播放器
- nyoj--116--士兵杀敌(二)(树状数组)
- STM32F103ZET6 之 通用定时器单脉冲模式实验
- 高德地图初步使用-显示
- nyoj--116--士兵杀敌(二)(树状数组)
- Windows Live Writer 使用指南
- ssh 公钥认证配置
- 新的时代新的教育
- 杭电oj 1007
- 项目管理过程组与知识领域
- HDU 2617 Happy 2009
- POJ 3169 Layout
- 【HDU5579 2015上海赛区G】【超级大讨论】Game of Arrays a[]+b[]+c[]有些位置可以减一,状态是否可能达成
- 雷霄骅(leixiaohua1020)的专栏