要求:
- 编写一个学生结构体
- 要求面向对象
- 要求用到链表连接每个学生
代码
#include <iostream>
#include <list>
using namespace std;
class Student
{
friend istream& operator>>(istream&in,Student &ra);
friend bool cmp(Student &a, Student &b);
public:
Student(){}
Student(string n,int a,float s):name(n),age(a),score(s){}
void show()
{
cout<<name<<"\t"<<age<<"\t"<<score<<endl;
}
string getName()
{
return name;
}
private:
string name;
int age;
float score;
};
istream& operator>>(istream&in,Student &ra)
{
in>>ra.name>>ra.age>>ra.score;
return in;
}
bool cmp(Student &a, Student &b)
{
if(a.age<b.age)
return true;
else
return false;
}
//应用程序管理类
class Application
{
enum App_MODE
{
Mode_Add = 1,
Mode_Show,
Mode_Sort,
Mode_Delete,
};
public:
int exec()
{
while(1)
{
int mode;
cout<<"[1]add [2]show [3]sort [4]delete:";
cin>>mode;
switch (mode) {
case Mode_Add:
{
Student s;
cout<<"name age score:";
cin>>s; //operator>>(cin,s);
list.push_back(s);
}
break;
case Mode_Show:
{
for(std::list<Student>::iterator it=list.begin(); it!=list.end(); it++)
{
it->show();
}
}
break;
case Mode_Sort:
list.sort(cmp);
break;
case Mode_Delete:
{
cout<<"please input del name:";
string delName;
cin>>delName;
std::list<Student>::iterator it;
for(it=list.begin(); it!=list.end(); it++)
{
if(it->getName() == delName)
{
//删除
cout<<"it->getName():"<<it->getName()<<endl;
list.erase(it);
break;
}
}
}
break;
}
}
}
private:
list<Student> list;
};
int main()
{
Application app;
return app.exec();
}
注意
-
list.sort(cmp);是调用bool cmp(Student &a, Student &b)这个函数,cmp是一个函数对象,等于回调这个函数,函数必须要bool cmp(const Type1 &a, const Type2 &b)这种格式
-
在排序函数中if(a.age<b.age),是表示升序,>的话是降序
-
list.erase(it);擦除迭代器后就不能++了,所以要break,所以只能删除一个