链表实现C/C++简单学生学籍管理系统。
实验结果图:
剩下的操作有兴趣的话复制粘贴去试试:
//Main.cpp
#include"ManagerStu.h"
int Student::AGE[] = { 0 };
int Student::CLNUM[] = { 0 };
string Student::DEPART[] = { " " };
int Student::departTypes = 0;
int Student::sizes = 0;
int main()
{
ManagerStu p;
p.start();
return 0;
}
Student类:
//Student.h
#pragma once
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
class Student {
public:
Student();
void setBasic();//录入
void changeStu();//修改人员信息
Student* delMessage(int nums);//删除人员信息
Student* searchStu(int nums);//根据编号查找人员
Student* searchStu(string names);//根据姓名查找人员
Student* searchStuSex(string sex);//根据性别查找人员
Student* searchStuAge(int age);//根据年龄查找人员
Student* searchStuClass(int classNum);//根据班号查找人员
Student* searchStuDepart(string Depart);//根据系别查找人员
void searchAll();//调用上述查找函数
//判断输入是否合法
bool judgeNums(int num);//学号
bool judgeClass(int num);//班号
bool judgeSex(string u);//性别
bool judgeName(string& inStr);//名字
bool judgeAge(int num);//年龄
//容错,分别对应(调用)上面函数
void judge1(int num);//学号
void judge2(int num);//班号
void judge3(string u);//性别
void judge4(string& inStr);//名字
void judge5(int num);//年龄
void statisticsSex();//根据性别统计人数
void statisticsClass();//根据班号统计人数
void statisticsAge();//根据年龄统计人数
void statisticsDepart();//根据系别统计人数
void statisticsAll();//调用上述统计函数
void showMess();//输出学生信息
void showBasic();
void setBasicFile();//批量录入
void writeF(ofstream& ofs);
static int AGE[31];//年龄1-30
static int CLNUM[201];//班号1-200
static string DEPART[15];//系别的名称
static int departTypes;//系别类型个数
static int sizes;//总人数
Student* next = NULL;//指针
private:
int nums;//学号(10位)
string name;//名字
string sex;//性别
int age;//年龄
string department;//系别
string majoy;//专业
int classNum;//班号
};
//Student.cpp
#include"Student.h"
Student::Student() {
nums = 0;
name = " ";
sex = " ";
age = 0;
classNum = 0;
majoy = " ";
department = " ";
}
void Student::setBasic() {//设置基本信息
cout << "依次输入学生的学号、姓名、性别、年龄、系、专业、班号:\n";
cin >> nums;
judge1(nums);
cin >> name;
judge4(name);
cin >> sex;
judge3(sex);
cin >> age;
judge5(age);
cin >> department >> majoy;
cin>> classNum;
judge2(classNum);
sizes++;
CLNUM[classNum]++;
AGE[age]++;
int i = 0;
while (i < departTypes) {
if (DEPART[i] == department) break;
i++;
}
if (i == departTypes) {
DEPART[i] = department;
departTypes++;
}
}
Student* Student::delMessage(int nums) {//根据学号nums删除学生
Student* p = this;
Student* pLast = NULL;
while (p != NULL) {
if (p->nums != nums) {
pLast = p;
p = p->next;
}
else break;
}
if (p == NULL) {
cout << "查无此人!无法进行删除。\n";
return NULL;
}
else {
if (p->nums == this->nums) return p->next;//如果是表头,返回表头的next
else {
pLast->next = p->next;
AGE[p->age]--;
CLNUM[p->classNum]--;
delete p;
return this;
}
}
}
void Student::changeStu() {//修改信息
cout << "输入相应学生的学号,进行修改信息:\n";
int u; cin >> u;
int times = 3;
while (times-- && !judgeNums(u))
cin >> u;
Student* p = this;
while (p != NULL) {
if (p->nums != u) p = p->next;
else break;
}
cout << "输入对应操作数进行修改:\n";
cout << "1.学号 2.姓名 3.性别 4.年龄 5.系别 6.专业 7.班号\n";
int oper;
cin >> oper;
switch (oper) {
case 1:
cout << "输入学号:";
cin >> p->nums;
p->judge1(p->nums);
break;
case 2:
cout << "输入姓名:";
cin >> p->name;
p->judge4(p->name);
break;
case 3:
cout << "输入性别:";
cin >> p->sex;
p->judge3(p->sex);
break;
case 4:
cout << "输入年龄:";
cin >> p->age;
p->judge5(p->age);
break;
case 5:
cout << "输入系别:";
cin >> p->department;
break;
case 6:
cout << "输入专业:";
cin >> p->majoy;
break;
case 7:
cout << "输入班号:";
cin >> p->classNum;
p->judge2(p->classNum);
break;
default:
break;
}
}
Student* Student::searchStu(int nums) {//根据学号寻找学生
//修改后的:
Student* p = this;//得到已有的链表
Student* u = NULL;//返回的节点
while (p != NULL) {
if (p->nums != nums) p = p->next;
else {
u = new Student;//改的地方
*u = *p;
u->next = NULL;
return u;
}
}
return NULL;
//原来有bug的:
/* Student* p = this;
Student* u = NULL;
while (p != NULL) {
if (p->nums != nums) p = p->next;
else {
u = p;
u->next = NULL;//错在这里
return u;
}
}
return NULL;
*/
}
Student* Student::searchStu(string names) {//根据名字寻找学生
Student* p = this;
Student* u = NULL;