⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 studentlistdelete.cpp

📁 很好的学习C++源码,基于C++版学生管理系统
💻 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 + -