首先运用面向对象的思想和方法,定义一个学生类。该类中有数据成员学生姓名,性别,专业,出生日期,家庭地址,英语入学成绩。
//学生类
class Student {
public:
void stu_Name(string Name) {
this->Name=Name;
}
void stu_Sex(string Sex) {
this->Sex=Sex;
}
void stu_Major(string Major) {
this->Major=Major;
}
void stu_Year(int Year) {
this->Year=Year;
}
void stu_Month(int Month) {
this->Month=Month;
}
void stu_Day(int Day) {
this->Day=Day;
}
void stu_Adress(string Adress) {
this->Adress=Adress;
}
void stu_Score(int Score) {
this->Score=Score;
}
string get_Name() {
return Name;
}
string get_Sex() {
return Sex;
}
string get_Major() {
return Major;
}
int get_Year() {
return Year;
}
int get_Month() {
return Month;
}
int get_Day() {
return Day;
}
string get_Adress() {
return Adress;
}
int get_Score() {
return Score;
}
private:
string Name;
string Sex;
string Major;
int Year;
int Month;
int Day;
string Adress;
int Score;
};
再根据学生信息存储结构,定义学生信息的结点类型,其中创建了一个新生类对象s,用来存放节点中的数据域,next是指针类型的成员,他指向struct StuNode类型的数据,用来存放下一个结点的地址,属于结点中的指针域。
typedef struct StuNode {
Student s;
struct StuNode *next;
} stu;
再定义一个链表类,链表类中的成员函数有创建单链表,输出单链表,删除单链表结点,通过姓名查询将链表中的其中一个结点输出,按性别、专业、年龄排序,保存链表中的信息。
//链表类
class StuListLink {
public:
void add();
void print();
void Delete();
void Sort();
void Look();
void sta_Sex();
void sta_Major();
void sta_Age();
void Save();
private:
stu *head;
stu *tail;
int count;
};
其中创建链表时,先输入需要录入的新生个数,再依次输入新生的各种信息,其中在输入新生性别时只能录入男或女,会通过字符串比较输入的数据是否为男或女,如果输入的格式不为男或女,将输出“输入有误,请重新输入”,此时要继续输入新生性别。在输入新生的出生日期时要依次输入新生出生日期的年、月、日,其中年份必须在2000~2021的范围内,月份必须在1~12的范围内,日期必须在1~31的范围内,最后再将刚才输入的信息存入链表结点中的数据域,接着输入下一位新生的信息,录入完毕后,将最后一个结点的数据域赋值为NULL,链表创建成功。
void StuListLink::add() {
stu *p;
cout<<"请输入学生总数:"<<endl;
cin>>count;
if(count<0) {
cout<<"错误,总数不能小于0"<<endl;
return;
}
head=new stu;
head->s.stu_Name("\0");
head->s.stu_Sex("\0");
head->s.stu_Major("\0");
head->s.stu_Year(0);
head->s.stu_Month(0);
head->s.stu_Day(0);
head->s.stu_Adress("\0");
head->s.stu_Score(0);
head->next =NULL;