📄 studentlistdelete.cpp
字号:
#include "StudentList.h" //学生链表类头文件
//函数功能:输入学号删除找到的学生信息
//输入参数:从键盘输入获得相应的值
//输出参数:显示找到的学生信息及提示
//返回值:无
//修改人:邹明上
//修改时间:2006.06.18
void CStudentList::Delete_Id()
{
char cDelete = 'Y';
string sTemp = "\0";
char* pDeleteId = new char[12];
while(cDelete == 'Y'||cDelete == 'y')
{
int nTotalId = 0;
FindList pFind_H; //定义一个结构体的变量,将查找到的学生节点地址连结成链表
printf("\n\n\t\t---------------------------------------\n");
while(7)
{
printf("\t\t 请输入删除学生学号(11位内):");
fflush(stdin);
cin >> sTemp;
if(InputJudge(sTemp,11))
{
strcpy(pDeleteId,sTemp.c_str()); //将自定义类型string变量字符串转换成char 字符串
break;
}
}
nTotalId = Find(&pFind_H,pDeleteId,1); //按学号找查时,传入一个整型常数1
if(nTotalId == 0) //nTotalId为0,表示没有找到符合要查找的学生学号,这里也可以用函数返回值来判断
{
printf("\n\t\t 系统信息:您要删除的学生信息不存在");
}
else
{
printf("\n 查寻结果以下:\n");
printf(" 学号是%s的学生信息如下:\n",pDeleteId);
printf(" 学生学号 姓 名 性别 学生电话 年龄 数学 C++ 英语 平均分 总成绩\n");
ShowOneInf(pFind_H.pNext->pNow);
printf("\n\t\t 确定要删除该学生信息吗?Y键确定,其他键退出");
fflush(stdin);
cDelete = getch();
if(cDelete == 'Y'||cDelete == 'y')
{
DeleteOneStuInf(pFind_H.pNext->pNow); //确定要删除时,调用函数实现删除该学生信息
if(CFileInOut::FileWrite(m_pHead,m_nSum) == false) //当删除一个学生节点后,调用文件保存函数更新文件信息
{
printf("\n\n\t\t 系统警告:文件保存错误");
}
else
{
printf("\n\t\t 系统信息:您已成功完成删除该学生信息");
}
delete pFind_H.pNext; //释放查找到创建的一个节点
}
else
{
printf("\n\t\t 系统信息:该学生信息没有被删除");
}
}
printf("\n\t\t 是否继续按学号删除?Y键确定,其他键退出");
fflush(stdin);
cDelete = getch();
}
delete[] pDeleteId;//释放pDeleteId指向的堆空间内存
}
//函数功能:输入姓名删除找到的学生信息
//输入参数:从键盘输入获得相应的值
//输出参数:显示找到的学生信息及提示
//返回值:无
//修改人:邹明上
//修改时间:2006.06.18
void CStudentList::Delete_Name()
{
char cDelete = 'Y';
string sTemp = "\0";
char* pDeleteName = new char[12];
while(cDelete == 'Y'||cDelete == 'y')
{
int nTotalName = 0;
FindList pFind_H; //定义一个结构体的变量,将查找到的学生节点地址连结成链表
printf("\n\n\t\t---------------------------------------\n");
while(7)
{
printf("\t\t 请输入删除学生姓名(4个汉字内):");
fflush(stdin);
cin >> sTemp;
if(InputJudge(sTemp,8))
{
strcpy(pDeleteName,sTemp.c_str()); //将自定义类型string变量字符串转换成char 字符串
break;
}
}
nTotalName = Find(&pFind_H,pDeleteName,2); //按学号找查时,传入一个整型常数1
if(nTotalName == 0) //当nTotalName为0,表示没有找到符合要查找的学生学号,这里也可以用函数返回值来判断
{
printf("\n\t\t 系统信息:您要删除的学生信息不存在");
}
else if(nTotalName == 1)
{
printf("\n 查寻结果以下:\n");
printf(" 姓名是 %s 的学生信息如下:\n",pDeleteName);
printf(" 学生学号 姓 名 性别 学生电话 年龄 数学 C++ 英语 平均分 总成绩\n");
ShowOneInf(pFind_H.pNext->pNow);
printf("\n\t\t 确定要删除该学生信息吗?Y键确定,其他键退出");
fflush(stdin);
cDelete = getch();
if(cDelete == 'Y'||cDelete == 'y')
{
DeleteOneStuInf(pFind_H.pNext->pNow); //确定要删除时,调用函数实现删除该学生信息
CFileInOut::FileWrite(m_pHead,m_nSum); //当删除一个学生节点后,调用文件保存函数更新文件信息
printf("\n\t\t 系统信息:您已成功完成删除该学生信息");
delete pFind_H.pNext; //释放查找到创建的一个节点
}
else
{
printf("\n\t\t 系统信息:该学生信息没有被删除");
}
}
else
{
int nTemp = 0;
FindList* pHead = pFind_H.pNext;
printf("\n 查寻结果以下:\n");
printf(" 姓名是 %s 学生共有%2d位相同\n",pDeleteName,nTotalName);
printf(" 学生学号 姓 名 性别 学生电话 年龄 数学 C++ 英语 平均分 总成绩\n");
for(int nI = 0;nI < nTotalName;nI ++,pHead = pHead->pNext)
{
printf(" 第%d位学生\n",nI + 1);
ShowOneInf(pHead->pNow);
}
printf("\n\t\t 请选择要删除第几位学生信息:");
scanf("%d",&nTemp);
fflush(stdin);
if(nTemp < 1 || nTemp > nTotalName)
{
printf("\n\t\t 系统信息:您的删除操作失败,请注意啰");
}
else
{
pHead = pFind_H.pNext;
for(FindList* pTemp = pHead;pTemp != NULL;pTemp = pTemp->pNext)
{
if(pTemp->nNo == nTemp) //查找创建链表中的nNo记录的是第几位学生,相当于数组的下标值
{
DeleteOneStuInf(pTemp->pNow); //确定要删除时,调用函数实现删除该学生信息
break;
}
}
if(CFileInOut::FileWrite(m_pHead,m_nSum) == false) //当删除一个学生节点后,调用文件保存函数更新文件信息
{
printf("\n\n\t\t 系统警告:文件保存错误");
}
else
{
printf("\n\t\t 系统信息:您已成功完成删除该学生信息");
}
FindList* pFind_Del = NULL;//定义一个变量,用于临时存放要释放内存地址
pHead = pFind_H.pNext; //因为查找的链表的第一个节点不是堆区分配的内存空间所以,第一个节点不能delete
while(pHead != NULL) //释放查找建立的链表空间
{
pFind_Del = pHead;
pHead = pHead->pNext;
delete pFind_Del;
}
}
}
printf("\n\t\t 是否继续按姓名删除?Y键确定,其他键退出");
fflush(stdin);
cDelete = getch();
}
delete[] pDeleteName;//释放pDeleteName指向的堆空间内存
}
//函数功能:删除链表的所有学生信息
//输入参数:从键盘输入获得相应的值
//输出参数:显示相应提示信息
//返回值:无
//修改人:邹明上
//修改时间:2006.06.18
void CStudentList::Delete_All()
{
char cContinue = 'y';
char cDelAll = '\0';
char sPassword[13] = "zoumingSHANG"; //预设的密码
printf("\n\n\t\t---------------------------------------");
while(cContinue == 'y'||cContinue == 'Y')
{
char sPw_input[13] = {0};
printf("\n\t\t您好:请输入系统管理密码:");
for(int nInput = 0;nInput < 12;nInput ++)
{
sPw_input[nInput] = getch();
printf("*");
}
printf("\n");
if(strcmp(sPassword,sPw_input))
{
printf("\t\t!呵呵.你输入的密码有误.\n");
printf("\t\t\002想再试一次吗?Y确定,其他键退出:");
fflush(stdin);
cContinue = getch();
cDelAll = '\0';
if(cContinue != 'y'&&cContinue != 'Y')
{
return;
}
printf("\n");
}
else
{
printf("\n\t\t系统警告:该操作一旦执行后,所有的数据信息是不可恢复的");
printf("\n\t\t 请懂重考虑后,再执行该项操作");
printf("\n\t\t确定要删除所有学生数据信息吗?Y确认,其他键盘退出");
fflush(stdin);
cDelAll = getchar();
if(cDelAll == 'y'||cDelAll == 'Y')
{
int nTT = m_nSum;
for(int nI = 0;nI < nTT;nI ++)
{
DeleteOneStuInf(m_pHead);
}
if(CFileInOut::FileWrite(m_pHead,m_nSum) == false) //当删除一个学生节点后,调用文件保存函数更新文件信息
{
printf("\n\n\t\t 系统警告:文件保存错误");
}
printf("\n\t\t系统信息:您已成功干掉所有学生信息");
}
else
{
printf("\n\t\t系统信息:您未执行删除所有学生信息操作");
}
printf("\n\t\t <任意键返回>");
getch();
return;
}
}
}
//函数功能:从形参获得一个节点地址,将该节点从链表中删除
//输入参数:从形参获得一个节点地址
//输出参数:无
//返回值:无
//修改人:邹明上
//修改时间:2006.06.18
void CStudentList::DeleteOneStuInf(CStudentObject* pNowI)
{
if(pNowI == m_pHead) //删除的节点是链表头节点
{
if(pNowI == m_pEnd) //链表只有一个节点的情况
{
m_pHead = m_pEnd = m_pHead->m_pFront = m_pHead->m_pNext = NULL;
}
else //删除的节点是链表头节点,但有多个节点时
{
m_pHead = pNowI->m_pNext;
m_pHead->m_pFront = NULL;
}
}
else if(pNowI == m_pEnd) //链表有两个或两个以上节点,且删除节点是最后一个
{
m_pEnd = m_pEnd->m_pFront;
m_pEnd->m_pNext = NULL;
}
else //删除节点既不是头,也不是尾的情况,双向学生链表这时删除很容易实现
{
CStudentObject* pBefore = pNowI->m_pFront;
CStudentObject* pAfter = pNowI->m_pNext;
pBefore->m_pNext = pAfter;
pAfter->m_pFront = pBefore;
}
--m_nSum;
delete pNowI;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -