请教一段C++代码的问题(2)
比较长,只好分作两部分发。
//****************************************
//***********类List(链表)定义***********
class List {
public:
List() {_root=0;}
void insert_node(Student *node); //插入结点
void delete_node(long num); //根据学号删除学生结点
void graduate(char *grade); //判断四年纪学生能否毕业及是否拿到学位
void sort_by_cet4(char *grade); //根据四级英语成绩链表由高到低排序,gr
ade为年级参数
void print_list(Student *stu);
private:
Student *_root;
};
//***************************************
//******类List(链表)成员函数实现*******
//***************************************
void List::insert_node(Student *node)
//************************************************
//**函 数 名:insert_node(Student *node)
//**功能描述:类List的公共成员函数,根据学号
//** 由从小到大排序插入结点(新的学生信息)
//************************************************
{
long stu_num=node->_num;
Student *current_node=_root; //当前结点
Student *previous=0; //当前结点的前驱结点
while (current_node!=0 && (stu_num > current_node->_num))
{
previous=current_node;
current_node=current_node->_next;
}
node->insert(); //插入结点
node->_ptr->_next=current_node;
//node->_next=current_node;
if (previous==0)
//_root=node;
_root=node->_ptr;
else
//previous->_next=node;
previous->_next=node->_ptr;
}
void List::delete_node(long num)
//************************************************
//**函 数 名:delete_node(long num)
//**功能描述:类List的公共成员函数,删除给出学号的结点(学生信息)
//************************************************
{
Student *current_node=_root; //当前结点
Student *previous=0; //当前结点的前驱结点
while (current_node!=0 && current_node->_num!=num)
{
previous=current_node;
current_node=current_node->_next;
}
if (current_node!=0 && previous==0) //要删除结点为头结点
{
_root=current_node->_next;
delete current_node;
}
else if (current_node!=0 && previous!=0) //要删除结点即不是头结点也不是尾结
点
{
previous->_next=current_node->_next;
delete current_node;
}
}
void List::graduate(char *grade)
//************************************************
//**函 数 名:graduate()
//**功能描述:类List的公共成员函数,对四年级学生进行查询,
//** 学分满60即可毕业,再通过CET4即可拿到学位,
//** 显示查询结果并写入文件s1.dat
//** 该函数可以扩展,可查询任何一个学生是否可以毕业,
//** 是否获得学位,此处只是简单实现。
//************************************************
{
const unsigned int MARK=60;
Student *ps=_root;
fstream outfile;
outfile.open("s1.dat",ios::app);
cout<<"学号\t"<<"姓名\t" //显示标题
<<"性别\t"<<"年级\t"
<<"学分\t"<<"CET-4\t"
<<"毕业\t"<<"学位\n";
while (ps!=0)
{
if (ps->_grade==grade)
{
if (ps->_credit_hour >= MARK) //符合毕业条件,学分满60
{
ps->print(); //显示该结点(学生)信息
cout<<"\tyes\t";
outfile<<ps->_num<<"\t"
<<ps->_name<<"\t"
<<ps->_sex<<"\t"
<<ps->_grade<<"\t"
<<ps->_credit_hour<<"\t"
<<ps->_cet4<<"\t"
<<"yes\t";
if (ps->_cet4 >= MARK) //通过四级英语考试
{
cout<<"yes\n";
outfile<<"yes\n";
}
else
{
cout<<"no\n";
outfile<<"no\n";
}
}
}
ps=ps->_next;
}
outfile.close();
}
void List::sort_by_cet4(char *grade)
//************************************************
//**函 数 名:order(char *grade)
//**功能描述:类List的公共成员函数,根据学生四级英语成绩由高到低排成链表
//**算法思想:删除不符合条件的结点,按CET4成绩排序并显示
//************************************************
{
Student *ps_current=_root; //指向当前要操作的结点
Student *ps_front=0; //指向当前结点的前一个
Student *ps_tail=0; //表尾指针
Student *ps_back=0; //指向ps_tail后面的结点
Student *ps1=0;
Student *ps2=0;
float fCet4=ps_current->_cet4;
//***********先删除不符合条件的点***********
//while (ps_current!=0 && ps_current->_grade==grade) //符合条件,指针向后移
while (ps_current!=0 && ps_current->_grade=="four")
{
ps_front=ps_current;
ps_current=ps_current->_next;
}
if (ps_current!=0 && ps_front==0) //头结点不符合条件
{
_root=ps_current->_next;
delete ps_current;
}
else if (ps_current!=0 && ps_front==0) //中间结点不符合条件
{
ps_front->_next=ps_current->_next;
delete ps_current;
}
//**********插入法排序*****************
ps_current=_root; //把指针移到表首
if (ps_current!=0)
{
ps_tail=ps_current;
while (ps_tail->_next!=0)
{
ps_back=ps_tail->_next; //ps_back指向要插入的结点
if (ps_back->_cet4 > ps_current->_cet4) //比头结点成绩高
{
ps_tail->_next=ps_back->_next;
ps_back->_next=ps_current;
ps_current=ps_back; //插入在第一个结点之前
}
else
{
ps1=ps_current;
ps2=ps1->_next;
while (ps_back->_cet4 < ps2->_cet4)
{
ps1=ps2;
ps2=ps2->_next;
}
if (ps_back==ps2)
ps_tail=ps_back;
else
{
ps_tail->_next=ps_back->_next; //删除
ps_back->_next=ps2;
ps1->_next=ps_back; //插入
}
}
}
}
ps_current=_root;
while (ps_current!=0)
{
ps_current->print();
cout<<endl;
ps_current=ps_current->_next;
}
}
//*********************************************
//***********主函数void main()*****************
//*********************************************
void main()
{
static List cList;
fstream outfile;
outfile.open("student.dat",ios::adjustfield);
long lNum;
char chName[8],chSex[2],chGrade[6];
unsigned int nCredit_hour;
float fCet4;
Student stu;
while (!cin.eof())
{
cout<<"\nPlease input the student's infomation:\n";
cout<<"number:";
cin>>lNum;
cout<<"\nname:";
cin>>chName;
cout<<"\nsex:";
cin>>chSex;
cout<<"\ngrade:";
cin>>chGrade;
cout<<"\ncredit_hour:";
cin>>nCredit_hour;
cout<<"\ncet4:";
cin>>fCet4;
outfile<<lNum<<"\t"
<<chName<<"\t"
<<chSex<<"\t"
<<chGrade<<"\t"
<<nCredit_hour<<"\t"
<<fCet4<<"\n";
stu.set_num(lNum);
stu.set_name(chName);
stu.set_sex(chSex);
stu.set_grade(chGrade);
stu.set_credit_hour(nCredit_hour);
stu.set_cet4(fCet4);
//Student stu(lNum,chName,chSex,chGrade,nCredit_hour,fCet4);
cout<<endl;
stu.print();
cList.insert_node(&stu);
}
outfile.close();
//cout<<"\nPlease input the grade of query:";
//char chA[6];
//cin>>chA;
//cout<<endl;
//cout<<"======================================";
//cout<<endl;
//cList.graduate(chA);
cout<<"\nPlease input the grade of sort:";
char chAc[6];
cin>>chAc;
cout<<endl;
cout<<"======================================";
cout<<"Sort by CET-4\n";
cList.sort_by_cet4(chAc);
}