专 业:
班 级:
姓 名:
学 号:
指导老师:
题目:
在异质链表中,每个节点的类型不要求相同,节点指针通常使用父类指针。以大学学生及教职人员为例,学生信息包括姓名、年龄、社会保险号、年级和平均成绩等,职员信息包括姓名、年龄、社会保险号和工资等,教授信息包括姓名、年龄、社会保险号、工资和研究方向等。为大学学生及教职人员建立一个异质链表,插入、删除和打印大学人员信息。
#include #include #include using namespace std; class person{ //定义一个共同的基类,它具有公共的数据成员 friend class list; //链表类作为本类的友元 protected: char name[20]; //定义姓名 int age; //定义年龄 char add[40]; //定义地址 char insurance-num[20]; //定义社会保险号 static person *ptr; //定义一个指向person类对象的静态指针 person *next; //指向下一个对象的指针 public: person(char *name,int age,char *add,char *insurance-num);//构造函数 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 *insurance-num, 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 *insurance-num,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 *insurance-num, 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 *insurance-num) { //person 的构造函数 strcpy(person::name,name); strcpy(person::add,add); strcpy(person::insurance-num,insurance-num); person::age=age; next=0; } void person::print() //基类的虚成员函数print()版本,输出基类数据成员 { cout<<"\\nname: "< // student::student(char *name,int age,char *add,char *insurance-num, int level, float grade_point_average):person(name,age,add,insurance-num) { //student 派生类的构造函数,需缀上基类的构造函数 student::level=level; student::grade_point_average=grade_point_average; } void student::print() //派生类 student的成员函数print()新版本 { person::print(); cout<<"grade point average: "< void student::insert() { //将 student 类的一个对象赋给 ptr 基类指针,这是允许的 ptr=new student(name,age,add,insurance-num,level,grade_point_average); } // teacher::teacher(char *name,int age,char *add,char *insurance-num, float salary):person(name,age,add,insurance-num) //teacher 派生类的构造函数,需缀上 //基类的构造函数 { teacher::salary=salary; } void teacher::print() //派生类 teacher的成员函数print()新版本 { person::print(); cout<<"salary: "< void teacher::insert() { //将 teacher类的一个对象赋给 ptr 基类指针,这是允许的 ptr=new teacher(name,age,add,insurance-num,salary); } // staff::staff(char *name,int age,char *add,char *insurance-num, float hourly_wages) :person(name,age,add,insurance-num) //staff 派生类的构造函数,需缀上 //基类的构造函数 { staff::hourly_wages=hourly_wages; } void staff::print() //派生类 staff的成员函数print()新版本 { person::print(); cout<<"hourly_wages: "< void staff::insert() { //将 staff类的一个对象赋给 ptr 基类指针,这是允许的 ptr=new staff(name,age,add,insurance-num,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) { previous=curr_node; curr_node=curr_node->next; } node->insert(); node->ptr->next=curr_node; if(previous==0) root=node->ptr; else previous->next=node->ptr; } 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 构造函数, student stu("a",20,"shanghai //定义 student 类的对象 stu,同时调用 student 构造函数, //也即先基类 person 构造函数,再自己 teacher tea("b",35,"beijing staff sta("c",40,"wuhan people.insert_person(&stu); people.insert_person(&tea); people.insert_person(&sta); cout<<"插入结束!\\n"; people.print_list(); cout<<"\\n以上打印出原链表! 打 c <回车> 继续...."; cin>>c; people.remove("c"); people.remove("b"); cout<<"删除结束!\\n"; people.print_list(); cout<<"\\n以上打印出删除后链表!\\n"; return 0; }下载本文