帮我编写一个C++程序
//朋友,你好,以下的程序你再简单修改一下就行了,注释的非常明白了
题目:
大学中的人员分三类 :学生,教师和职员,他们的基本信息如下:
学生:姓名,年龄,学号,年级,成绩
教师:姓名,年龄,身份证号,职称,工资
职员:姓名,年龄,身份证号,工资
现在需要管理各类人员的信息,请用面向对象的方法设计一个异质链表,用来存放他们的信息。
/*异质链表实现:有三个类 student,teacher,staff,再定义一个
链表类,此类用来存放这几个不同类的对象,并将链表类 list 声明为所有这些
类的友元,使它们可以访问它们的私有成员。*/
#include <iostream.h>
#include <string.h>
#include <conio.h>
class person{ //定义一个***同的基类,它具有公***的数据成员
friend class list; //链表类作为本类的友元
protected:
char name[20]; //定义姓名
int age; //定义年龄
char add[40]; //定义地址
char tele[20]; //定义电话号码
static person *ptr; //定义一个指向person类对象的静态指针
person *next; //指向下一个对象的指针
public:
person(char *name,int age,char *add,char *tele);//构造函数
virtual void print(); //说明虚函数
virtual void insert(){};//定义虚函数并且什么也不做,只定义一个接口
};
class student:public person{ //派生类 student
friend class list; //链表类作为本类的友元
int level; //定义年级
float grade_point_average; //定义平均分
public:
student(char *name,int age,char *add,char *tele, int level,
float grade_point_average); //声明构造函数
void print(); //重新定义print()函数
void insert(); //重新定义insert()函数
};
//
class teacher:public person{ //派生类 teacher
friend class list; //链表类作为本类的友元
float salary; //定义工资
public:
teacher(char *name,int age,char *add,char *tele,float salary);
//声明构造函数
void print(); //重新定义print()函数
void insert(); //重新定义insert()函数
};
//
class staff:public person{ //派生类 staff
friend class list; //链表类作为本类的友元
float hourly_wages; //定义计时工资
public:
staff(char *name,int age,char *add,char *tele,
float hourly_wages); //声明构造函数
void print(); //重新定义print()函数
void insert(); //重新定义insert()函数
};
//
class list{ //定义异质链表类
person *root; //链表头指针
public:
list(){ root=0; } //链表构造函数,初始为 0
void insert_person(person *node); //向链表插入一个对象结点
void remove(char *name); //从链表移去一个对象结点
void print_list(); //输出整个链表
};
//
person::person(char *name,int age,char *add,char *tele)
{ //person 的构造函数
strcpy(person::name,name);
strcpy(person::add,add);
strcpy(person::tele,tele);
person::age=age;
next=0;
}
void person::print() //基类的虚成员函数print()版本,输出基类数据成员
{
cout<<"\nname: "<<name<<"\n";
cout<<"age: "<<age<<"\n";
cout<<"address: "<<add<<"\n";
cout<<"telephone number: "<<tele<<"\n";
}
//
student::student(char *name,int age,char *add,char *tele, int level,
float grade_point_average):person(name,age,add,tele)
{ //student 派生类的构造函数,需缀上基类的构造函数
student::level=level;
student::grade_point_average=grade_point_average;
}
void student::print() //派生类 student的成员函数print()新版本
{
person::print();
cout<<"grade point average: "<<grade_point_average<<"\n";
}
void student::insert()
{ //将 student 类的一个对象赋给 ptr 基类指针,这是允许的
ptr=new student(name,age,add,tele,level,grade_point_average);
}
//
teacher::teacher(char *name,int age,char *add,char *tele, float salary)
:person(name,age,add,tele) //teacher 派生类的构造函数,需缀上
//基类的构造函数
{
teacher::salary=salary;
}
void teacher::print() //派生类 teacher的成员函数print()新版本
{
person::print();
cout<<"salary: "<<salary<<"\n";
}
void teacher::insert()
{ //将 teacher类的一个对象赋给 ptr 基类指针,这是允许的
ptr=new teacher(name,age,add,tele,salary);
}
//
staff::staff(char *name,int age,char *add,char *tele, float hourly_wages)
:person(name,age,add,tele) //staff 派生类的构造函数,需缀上
//基类的构造函数
{
staff::hourly_wages=hourly_wages;
}
void staff::print() //派生类 staff的成员函数print()新版本
{
person::print();
cout<<"hourly_wages: "<<hourly_wages<<"\n";
}
void staff::insert()
{ //将 staff类的一个对象赋给 ptr 基类指针,这是允许的
ptr=new staff(name,age,add,tele,hourly_wages);
}
//
void list::insert_person(person *node)
{ //向异质链表插入一个对象,可能是student或teacher或staff
char key[20];
strcpy(key,node->name); //将需插入的对象的姓名赋给key
person *curr_node=root;
person *previous=0; //定义二个查找指针
while(curr_node !=0 && strcmp(curr_node->name,key)<0)
{ //用 curr_node在前,previous在后及 key 循环查找插入位置,由 name
//字符串升序排序,strcmp(串1,串2)<0 表示串1<串2,继续找
previous=curr_node;
curr_node=curr_node->next;
}
node->insert(); //由于 insert() 是虚函数,它会根据 node 指针的对象调
//用不同的版本:ptr=new <三个派生类名之一>(数据成员变量表),
//而数据成员变量是由构造函数赋值的,由 new 特性: int *s;
// s=new int(20); 会开辟空间并把值20给空间,因此说:
//调用虚函数将待插入对象赋给 ptr 所指向的单元
node->ptr->next=curr_node;
if(previous==0)
root=node->ptr;
else
previous->next=node->ptr;
//以上三句是把 ptr 指的结点插入链中,这里:node->ptr, previous->ptr,
//curr_node->ptr 统统都是一样的,即相当于 person::ptr 说明 ptr 受限的
//对象是stu::ptr或tea::ptr或sta::ptr,因此 node->ptr->next 可写成
// (node->ptr)->next 或 person::ptr->next 但不能把 node->name 写成
// person::name,它只能出现在构造函数中
}
void list::remove(char *name)
{ //从异质链表中移去一对象,此对象用关键字 name 去匹配
person *curr_node=root;
person *previous=0;
while(curr_node !=0 && strcmp(curr_node->name,name)!=0)
{ //用循环寻找此对象
previous=curr_node;
curr_node=curr_node->next;
}
if(curr_node!=0 && previous==0) //若此对象为链表中的头结点
{
root=curr_node->next;
delete curr_node;
}
else if(curr_node!=0 && previous!=0) //此对象为链表中的非头结点
{
previous->next=curr_node->next;
delete curr_node;
}
}
void list::print_list()
{
person *cur=root; //先将头指针赋给 cur
while(cur!=0) //循环输出结点内容并移动指针
{
cur->print(); //根据 cur 所指向的对象不同调用不同的 print() 版本
cur=cur->next;
}
}
//
person *person::ptr=0; //为静态变量赋初值
int main()
{
char c;
list people; //定义 list 类的对象 people ,同时调用 list 构造函数,
//也即 root=0;
student stu("刘影liuying",20,"上海shanghai","03578395-456",3,80.0);
//定义 student 类的对象 stu,同时调用 student 构造函数,
//也即先基类 person 构造函数,再自己
teacher tea("李明liming",35,"北京beijing","0105918695-106",560.50);
staff sta("陈林chenling",40,"青岛qingdao","05325895944-335",10);
people.insert_person(&stu);
people.insert_person(&tea);
people.insert_person(&sta);
cout<<"插入结束!\n";
people.print_list();
cout<<"\n以上打印出原链表! 打 c <回车> 继续....";
cin>>c;
people.remove("陈林chenling");
people.remove("李明liming");
people.remove("王迢wangchong");
cout<<"删除结束!\n";
people.print_list();
cout<<"\n以上打印出删除后链表!\n";
return 0;
}