📄 studentlistshow.cpp
字号:
#include "StudentList.h" //学生链表类头文件
//函数功能:显示一个学生所有信息
//输入参数:从调用函数获得一个链表一个结点
//输出参数:无
//返回值:无
//修改人:邹明上
//修改时间:2006.06.17
void CStudentList::ShowOneInf(CStudentObject* pPrint) const
{
printf(" %-11s %-8s %2s %11s %-2d %6.2lf %6.2lf %6.2lf %6.2lf %7.2lf\n",
pPrint->m_sId,pPrint->m_sName,pPrint->m_sSex,pPrint->m_sTel,
pPrint->m_nAge,pPrint->m_dbMath,pPrint->m_dbClangue,pPrint->m_dbEnglish,
pPrint->m_dbAverage,pPrint->m_dbSum);
}
//函数功能:按学号从小至大显示所有学生信息
//输入参数:无
//输出参数:显示输入值学生信息
//返回值:无
//修改人:邹明上
//修改时间:2006.06.17
void CStudentList::Show_Id()
{
printf("\n\n目前学生总数是:%3d人\n",m_nSum);
printf("显示说明:按学生学号从小至大\n");
printf("序号 学生学号 姓 名 性别 学生电话 年龄 数学 C++ 英语 平均分 总成绩\n");
QueueData(1); //通过一个排序函数按学号从小至大排序后再显示
m_pMove = m_pHead;
for(int nI = 1;m_pMove != NULL;nI ++)
{
printf("%-3d %-11s %-8s %2s %11s %-2d %6.2lf %6.2lf %6.2lf %6.2lf %7.2lf\n",
nI,m_pMove->m_sId,m_pMove->m_sName,m_pMove->m_sSex,
m_pMove->m_sTel,m_pMove->m_nAge,m_pMove->m_dbMath,
m_pMove->m_dbClangue,m_pMove->m_dbEnglish,m_pMove->m_dbAverage,m_pMove->m_dbSum);
m_pMove = m_pMove->m_pNext;
}
printf("<显示结束> 任意键返回");
fflush(stdin);
getch();
}
//函数功能:按姓名从小至大显示所有学生信息
//输入参数:无
//输出参数:显示输入值学生信息
//返回值:无
//修改人:邹明上
//修改时间:2006.06.17
void CStudentList::Show_Name()
{
printf("\n\n目前学生总数是:%3d人\n",m_nSum);
printf("显示说明:按学生姓名由低至高\n");
printf("序号 学生学号 姓 名 性别 学生电话 年龄 数学 C++ 英语 平均分 总成绩\n");
QueueData(2); //通过一个排序函数按姓名从低至大高排序后再显示
m_pMove = m_pHead;
for(int nI = 1;m_pMove != NULL;nI ++)
{
printf("%-3d %-11s %-8s %2s %11s %-2d %6.2lf %6.2lf %6.2lf %6.2lf %7.2lf\n",
nI,m_pMove->m_sId,m_pMove->m_sName,m_pMove->m_sSex,
m_pMove->m_sTel,m_pMove->m_nAge,m_pMove->m_dbMath,
m_pMove->m_dbClangue,m_pMove->m_dbEnglish,m_pMove->m_dbAverage,m_pMove->m_dbSum);
m_pMove = m_pMove->m_pNext;
}
printf("<显示结束> 任意键返回");
fflush(stdin);
getch();
}
//函数功能:按总成绩从高至低显示所有学生信息
//输入参数:无
//输出参数:显示输入值学生信息
//返回值:无
//修改人:邹明上
//修改时间:2006.06.17
void CStudentList::Show_Grade()
{
printf("\n\n目前学生总数是:%3d人\n",m_nSum);
printf("显示说明:按学生分数总成绩由高至低\n");
printf("序号 学生学号 姓 名 性别 学生电话 年龄 数学 C++ 英语 平均分 总成绩\n");
QueueData(3); //通过一个排序函数按总成绩从高至低排序后再显示
m_pMove = m_pHead;
for(int nI = 1;m_pMove != NULL;nI ++)
{
printf("%-3d %-11s %-8s %2s %11s %-2d %6.2lf %6.2lf %6.2lf %6.2lf %7.2lf\n",
nI,m_pMove->m_sId,m_pMove->m_sName,m_pMove->m_sSex,
m_pMove->m_sTel,m_pMove->m_nAge,m_pMove->m_dbMath,
m_pMove->m_dbClangue,m_pMove->m_dbEnglish,m_pMove->m_dbAverage,m_pMove->m_dbSum);
m_pMove = m_pMove->m_pNext;
}
printf("<显示结束> 任意键返回");
fflush(stdin);
getch();
}
//函数功能:用冒泡法对所有学生信息按有同显示方式进行排序
//输入参数:无
//输出参数:无
//返回值:无
//修改人:邹明上
//修改时间:2006.06.17
void CStudentList::QueueData(int nNum)
{
int nIfMark = 0;
/* 判断在第二层循环中是否进行过交换,如果没有进行过一次交换,
则说明现在的数组排序已经是从小到大,则不会进行排序循环*/
for(int nI = 0;nI < m_nSum - 1;nI ++)
{
m_pMove = m_pHead; //每运行完一次nI,都要使pMove指向链表的头pHead
for(int nJ = 0;nJ < m_nSum - 1 - nI;nJ ++)
{
switch(nNum)
{
case 1:
{
if(strcmp(m_pMove->m_sId,m_pMove->m_pNext->m_sId) == 1)
{
//对找到的满足前一个学号大于后一个学号的情况时将两个学生信息进行交换
DataExchange(m_pMove);
m_pMove = m_pMove->m_pFront;//当交换了两个节点后,移动节点应返回到前一个节点,这样才能保证指针移动次数与nJ即第二层循环同步
//注意:直接交换两个节点指针地址与交换两个节点中数据不同之处就在上面语句之处
nIfMark = 1;
}
break;
}
case 2:
{
if(strcmp(m_pMove->m_sName,m_pMove->m_pNext->m_sName) == 1)
{
//对找到的满足前一个姓名大于后一个姓名的情况时将两个学生信息进行交换
DataExchange(m_pMove);
m_pMove = m_pMove->m_pFront;//当交换了两个节点后,移动节点应返回到前一个节点,这样才能保证指针移动次数与nJ即第二层循环同步
//注意:直接交换两个节点指针地址与交换两个节点中数据不同之处就在上面语句之处
nIfMark = 1;
}
break;
}
case 3:
{
if((m_pMove->m_dbSum) < (m_pMove->m_pNext->m_dbSum))
{
//对找到的满足前一个分数总成绩小于后一个总成绩的情况时将两个学生信息进行交换
DataExchange(m_pMove);
m_pMove = m_pMove->m_pFront;//当交换了两个节点后,移动节点应返回到前一个节点,这样才能保证指针移动次数与nJ即第二层循环同步
//注意:直接交换两个节点指针地址与交换两个节点中数据不同之处就在上面语句之处
nIfMark = 1;
}
break;
}
}
m_pMove = m_pMove->m_pNext;
}
if(nIfMark == 0)
{
break;
}
}
}
//函数功能:实现交换当前节点和其后一个节点的地址
//输入参数:无
//输出参数:无
//返回值:无
//修改人:邹明上
//修改时间:2006.06.17
void CStudentList::DataExchange(CStudentObject* pNow)
{
/*---利用双向链表的特性,通过交换节点中指针指向地址实现排序的方法-----*/
CStudentObject* pBefore = pNow->m_pFront; //pBefore指向当前节点的前一个节点地址
CStudentObject* pNowTemp = pNow; //pNowTemp指向当前节点地址
CStudentObject* pAfter = pNow->m_pNext; //pAfter 指向当前节点后一个节点地址
CStudentObject* pAgain = pAfter->m_pNext; //pAgain 指向当前节点后面第二个节点地址
if(pNowTemp == m_pHead && pAfter == m_pEnd)
{ //这时只有两个节点,且pNowTemp == m_pHead,交换头m_pHead 与尾m_pEnd
pNowTemp->m_pFront = pAfter;
pNowTemp->m_pNext = NULL;
pAfter->m_pFront = NULL;
pAfter->m_pNext = pNowTemp;
m_pHead = pAfter; //交换后的m_pHead指向pAfter
m_pEnd = pNowTemp; //交换后的m_pEnd指向pBefore
}
else if(pNowTemp == m_pHead && pAfter != m_pEnd)
{ //这时有两个以上节点,且pNowTemp == m_pHead,交换节点后,m_pHead指针指向地址要变化
pNowTemp->m_pFront = pAfter;
pNowTemp->m_pNext = pAgain;
pAfter->m_pFront = NULL;
pAfter->m_pNext = pNowTemp;
pAgain->m_pFront = pNowTemp;
m_pHead = pAfter; //交换后的pAfter就是头指针m_pHead
}
else if(pNowTemp != m_pHead && pAfter == m_pEnd)
{ //当前节点的后一个节点是尾指m_pEnd,交换后m_pEnd指针要变化
pBefore->m_pNext = pAfter;
pNowTemp->m_pFront = pAfter;
pNowTemp->m_pNext = NULL;
pAfter->m_pFront = pBefore;
pAfter->m_pNext = pNowTemp;
m_pEnd = pNowTemp; //交换后的pNowTemp就是尾指针了
}
else
{ //当前节点在链表中属于一般情况
pBefore->m_pNext = pAfter;
pNowTemp->m_pFront = pAfter;
pNowTemp->m_pNext = pAgain;
pAfter->m_pFront = pBefore;
pAfter->m_pNext = pNowTemp;
pAgain->m_pFront = pNowTemp;
}
/*-------以下是通过交换节点中数据实现排序的方法------*/
/*char sString[12] = {0};
int nTemp_Age = 0;
double dbTemp_all = 0.00;
strcpy(sString,pNow->m_sId);
strcpy(pNow->m_sId,pNow->m_pNext->m_sId);
strcpy(pNow->m_pNext->m_sId,sString);
strcpy(sString,pNow->m_sName);
strcpy(pNow->m_sName,pNow->m_pNext->m_sName);
strcpy(pNow->m_pNext->m_sName,sString);
strcpy(sString,pNow->m_sSex);
strcpy(pNow->m_sSex,pNow->m_pNext->m_sSex);
strcpy(pNow->m_pNext->m_sSex,sString);
strcpy(sString,pNow->m_sTel);
strcpy(pNow->m_sTel,pNow->m_pNext->m_sTel);
strcpy(pNow->m_pNext->m_sTel,sString);
nTemp_Age = pNow->m_nAge;
pNow->m_nAge = pNow->m_pNext->m_nAge;
pNow->m_pNext->m_nAge = nTemp_Age;
dbTemp_all = pNow->m_dbMath;
pNow->m_dbMath = pNow->m_pNext->m_dbMath;
pNow->m_pNext->m_dbMath = dbTemp_all;
dbTemp_all = pNow->m_dbClangue;
pNow->m_dbClangue = pNow->m_pNext->m_dbClangue;
pNow->m_pNext->m_dbClangue = dbTemp_all;
dbTemp_all = pNow->m_dbEnglish;
pNow->m_dbEnglish = pNow->m_pNext->m_dbEnglish;
pNow->m_pNext->m_dbEnglish = dbTemp_all;
dbTemp_all = pNow->m_dbAverage;
pNow->m_dbAverage = pNow->m_pNext->m_dbAverage;
pNow->m_pNext->m_dbAverage = dbTemp_all;
dbTemp_all = pNow->m_dbSum;
pNow->m_dbSum = pNow->m_pNext->m_dbSum;
pNow->m_pNext->m_dbSum = dbTemp_all;*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -