视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
面向对象实验报告
2025-10-04 09:45:53 责编:小OO
文档
面向对象实验报告

            专    业: 

            班    级:

            姓    名: 

            学    号:

            指导老师: 

题目:

在异质链表中,每个节点的类型不要求相同,节点指针通常使用父类指针。以大学学生及教职人员为例,学生信息包括姓名、年龄、社会保险号、年级和平均成绩等,职员信息包括姓名、年龄、社会保险号和工资等,教授信息包括姓名、年龄、社会保险号、工资和研究方向等。为大学学生及教职人员建立一个异质链表,插入、删除和打印大学人员信息。

#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: "<cout<<"age: "<cout<<"address: "<cout<<"insurance number: "<

// 

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; 

}下载本文

显示全文
专题