#include "student.h" CStu::CStu() { //链表头指针 m_pHead = NULL; //链表尾指针 m_pEnd = NULL; m_stuCount = 0; } CStu::~CStu() { while (m_pHead) { Student* pTemp = m_pHead; m_pHead = m_pHead->pNext; delete pTemp; } } //添加功能 void CStu::AddStudent() { //输入学生信息 char stuNum[15]; cout << "输入学生学号: "; cin >> stuNum; //1、检测编号重复 Student* pTemp = m_pHead; while (pTemp) { if (strcmp (pTemp->stuNum , stuNum) == 0) { cout << "学号已存在,请重新添加\n"; return ; } pTemp = pTemp->pNext; } //2、添加 //创建节点 Student *pTempStu = new Student; //节点成员赋值 strcpy(pTempStu->stuNum,stuNum); cout << "\n输入学生名字: "; cin >> pTempStu->stuName; cout << "\n输入学生性别: "; cin >> pTempStu->stuSex; cout << "\n输入学生年龄: "; cin >> pTempStu->stuAge; cout << "\n输入学生系别: "; cin >> pTempStu->stuSystem; cout << "\n输入学生班级: "; cin >> pTempStu->stuClass; cout << "\n输入学生联系方式: "; cin >> pTempStu->stuTel; //指针赋值 pTempStu->pNext = NULL; pTempStu->pPre = NULL; //链接到链表上 if (NULL == m_pHead) { m_pHead = pTempStu; m_pEnd = pTempStu; } else { m_pEnd->pNext = pTempStu; pTempStu->pPre = m_pEnd; m_pEnd = pTempStu; } m_stuCount++; //学生人数增加 } //查询 根据名字 或者学号 void CStu::SCanStudentMsg() { //判断 是否有学生, 没有学生就不用查了 if (NULL == m_pHead) { cout << "没有学生,请添加学生再查询\n"; return ; } //输入名字或者学号 cout << "\n输入名字或者学号: "; char arrTemp[15]; cin >> arrTemp; //判断下是学号还是名字 Student* pTemp = m_pHead; if (arrTemp[0] >= ‘0‘ && arrTemp[0] <= ‘9‘) { while (pTemp) { if (strcmp (pTemp->stuNum , arrTemp) == 0) { //输出学生信息 ShowStu(pTemp); return ; } pTemp = pTemp->pNext; } } else { while (pTemp) { if (strcmp (pTemp->stuName , arrTemp) == 0) { //输出学生信息 ShowStu(pTemp); return ; } pTemp = pTemp->pNext; } } cout << "\n查无此学生\n"; } //删除指定学生 void CStu::DeleteStu() { //判断 是否有学生, 没有学生就不用编辑 if (NULL == m_pHead) { cout << "记录为空!\n"; return ; } //输入名字或者学号 cout << "\n输入需要删除的学生的学号: "; char arrTemp[15]; cin >> arrTemp; //判断下是学号还是名字 Student* pTemp = m_pHead; while (pTemp) { if (strcmp (pTemp->stuNum , arrTemp) == 0) { //删除学生信息 DeleteStu(pTemp); m_stuCount--; //学生人数减少一个 return ; } pTemp = pTemp->pNext; } cout << "\n查无此学生\n"; } //删除指定学生 void CStu::DeleteStu(Student* pTemp) { //链表有一个几点 if (m_pHead == m_pEnd) { delete m_pHead; m_pHead = NULL; m_pEnd = NULL; } else if(m_pHead->pNext == m_pEnd) //有两个节点 { if (pTemp == m_pHead) //是头 { delete m_pHead; m_pHead = m_pEnd; m_pEnd->pPre = NULL; } else //是尾巴 { delete m_pEnd; m_pEnd = m_pHead; m_pHead->pNext = NULL; } } else { if (pTemp == m_pHead) //是头 { m_pHead = m_pHead->pNext; m_pHead->pPre = NULL; delete pTemp; } else if (pTemp == m_pEnd) //是尾巴 { m_pEnd = m_pEnd->pPre; m_pEnd->pNext = NULL; delete pTemp; } else //中间节点 { pTemp->pPre->pNext = pTemp->pNext; pTemp->pNext->pPre = pTemp->pPre; delete pTemp; } } } //编辑 void CStu::EditStuMsg() { //判断 是否有学生, 没有学生就不用编辑 if (NULL == m_pHead) { cout << "没有学生,请添加学生再查询\n"; return ; } //输入名字或者学号 cout << "\n输入需要修改的学生的名字或者学号: "; char arrTemp[15]; cin >> arrTemp; //判断下是学号还是名字 Student* pTemp = m_pHead; if (arrTemp[0] >= ‘0‘ && arrTemp[0] <= ‘9‘) { while (pTemp) { if (strcmp (pTemp->stuNum , arrTemp) == 0) { //编辑学生信息 EditStu(pTemp); return ; } pTemp = pTemp->pNext; } } else { while (pTemp) { if (strcmp (pTemp->stuName , arrTemp) == 0) { //编辑学生信息 EditStu(pTemp); return ; } pTemp = pTemp->pNext; } } cout << "\n查无此学生\n"; } //编辑指定学生信息 void CStu::EditStu(Student* pTemp) { //输入学生信息 char stuNum[15]; cout << "输入修改后的学生学号: "; cin >> stuNum; //1、检测编号重复 Student* pTemp1 = m_pHead; while (pTemp1) { if (strcmp (pTemp1->stuNum , stuNum) == 0) { cout << "学号已存在,请重新添加\n"; return ; } pTemp1 = pTemp1->pNext; } strcpy(pTemp->stuNum, stuNum); cout << "\n输入修改后的名字: "; cin >> pTemp->stuName; cout << "\n输入修改后的性别: "; cin >> pTemp->stuSex; cout << "\n输入修改后的年龄: "; cin >> pTemp->stuAge; cout << "\n输入修改后的系别: "; cin >> pTemp->stuSystem; cout << "\n输入修改后的班级: "; cin >> pTemp->stuClass; cout << "\n输入修改后的联系方式: "; cin >> pTemp->stuTel; } void CStu::ShowStu(Student* pTemp) { cout << "学号 姓名 性别 年龄 系别 班级 联系方式\n"; cout << pTemp->stuNum << " " << pTemp->stuName << " " << pTemp->stuSex << " " << pTemp->stuAge << " " << pTemp->stuSystem << " " << pTemp->stuClass << " " << pTemp->stuTel << "\n"; } //显示 void CStu::ShowAllStuMsg() { //没有人就不用显示了 if (NULL == m_pHead) { cout << "没有学生\n"; return ; } //循环显示 cout << "学号 姓名 性别 年龄 系别 班级 联系方式\n"; Student* pTemp = m_pHead; while (pTemp) { //输出学生信息 cout << pTemp->stuNum << " " << pTemp->stuName << " " << pTemp->stuSex << " " << pTemp->stuAge << " " << pTemp->stuSystem << " " << pTemp->stuClass << " " << pTemp->stuTel << "\n"; pTemp = pTemp->pNext; } } //菜单 //1、统计学生总人数 int CStu::StuCount() { cout << m_stuCount << endl; return m_stuCount; } //保存进文件 void CStu::SaveInFile() { //打开文件,覆盖打开 FILE* pFile = fopen("stu.txt", "w"); Student* pTemp = m_pHead; while (pTemp->pNext) { //写入文件 fprintf(pFile, "%s %s %s %u %s %s %s\n", pTemp->stuNum, pTemp->stuName, pTemp->stuSex, pTemp->stuAge, pTemp->stuSystem, pTemp->stuClass, pTemp->stuTel); pTemp = pTemp->pNext; } fprintf(pFile, "%s %s %s %u %s %s %s", pTemp->stuNum, pTemp->stuName, pTemp->stuSex, pTemp->stuAge, pTemp->stuSystem, pTemp->stuClass, pTemp->stuTel); //关闭文件 fclose(pFile); } //读取 void CStu::ReadFromFile() { FILE* pFile = fopen("stu.txt", "r"); while (!feof(pFile)) { Student* pTemp = new Student; //写入文件 fscanf(pFile, "%s%s%s%u%s%s%s", pTemp->stuNum, pTemp->stuName, pTemp->stuSex, &pTemp->stuAge, pTemp->stuSystem, pTemp->stuClass, pTemp->stuTel); pTemp->pNext = NULL; pTemp->pPre = NULL; //加入链表 //链接到链表上 if (NULL == m_pHead) { m_pHead = pTemp; m_pEnd = pTemp; } else { m_pEnd->pNext = pTemp; pTemp->pPre = m_pEnd; m_pEnd = pTemp; } } //关闭文件 fclose(pFile); }