#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);
}