当前位置:文档之家› 利用多态性实现人员信息管理系统

利用多态性实现人员信息管理系统

3、利用多态性实现人员信息管理系统源程序代码/*****************************************************************************/ /*模块名称:12.cpp功能描述:这是一个非多态方法实现的异质链表程序创建人:修改记录:*/#include <string.h>#include <stdio.h>#include <iostream.h>//枚举三种节点类型enum node_type {student,staff,professor};//结构体,表示学生的特殊信息struct student_type{float average; //平均分int grade; //年级};/*************************************************************************/ /*函数名称:node功能描述:定义类node修改记录:*/class node{friend class list;private:char name[15]; //姓名char sex[2]; //性别int age; //年龄char ID[20]; //身份证号char address[30]; //地址long phone; //电话node_type type; //节点类型//联合,定义单一节点类型union{student_type s;float annual_salary;float hourly_salary;};node * next;public:node(char * name1,char * sex1, int age1,char * id1,char * address1,long phone1,node_type type1){strcpy(name,name1);strcpy(sex,sex1);age= age1;strcpy(ID,id1);strcpy(address,address1);phone= phone1;type= type1;next= 0;}node(){name[0]='\0';sex[0]='\0';age= 0;ID[0]='\0';address[0]='\0';phone= 0;next= 0;}/*************************************************************************/ /*函数名称:set_node_type功能描述:设置节点的类型修改记录:*/void set_node_type(node_type type1){type=type1;}/*************************************************************************/ /*函数名称:set_name功能描述:设置姓名修改记录:*/void set_name(char * name1){strcpy(name,name1);}/*************************************************************************/ /*函数名称:set_sex功能描述:设置性别修改记录:*/void set_sex(char * sex1){strcpy(sex,sex1);}/*************************************************************************/ /*函数名称:set_age功能描述:设置年龄修改记录:*/void set_age(int age1){age= age1;}/*************************************************************************/ /*函数名称:set_ID功能描述:设置身份证号修改记录:*/void set_ID(char * id1){strcpy(ID,id1);}/*************************************************************************/ /*函数名称:set_address功能描述:设置地址修改记录:*/void set_address(char * address1){strcpy(address,address1);}/*************************************************************************/ /*函数名称:set_phone功能描述:设置电话号码修改记录:*/void set_phone(long phone1){phone= phone1;}/*************************************************************************/ /*函数名称:set_average功能描述:设置学生的平均分修改记录:*/void set_average(float average1){s.average= average1;}/*************************************************************************/ /*函数名称:set_grade功能描述:设置学生的年级修改记录:*/void set_grade(int grade1){s.grade=grade1;}/*************************************************************************/ /*函数名称:set_annual_salary功能描述:设置教授的年薪修改记录:*/void set_annual_salary(float salary){annual_salary= salary;}/*************************************************************************/ /*函数名称:set_annual_salary功能描述:设置教工的小时工资修改记录:*/void set_hourly_salary(float hsalary){hourly_salary= hsalary;}};/*************************************************************************/ /*函数名称:list功能描述:list类的定义修改记录:*/class list{private:node * root;public:list(){root= 0;}void insert(node * n);void remove(char * id1);void search(char * id1);void print_list();};/*************************************************************************/ /*函数名称:insert功能描述:插入节点修改记录:*/void list::insert (node * n){//list 以ID为关键字排序,ID从小到大的顺序进行排列char key[18];strcpy(key,n->ID) ;node * current_node=root;node * previous= 0;while(current_node!=0 && strcmp(current_node->ID,key)<0){previous=current_node;current_node=current_node->next ;}node*new_node=newnode(n->name ,n->sex ,n->age ,n->ID ,n->address ,n->phone,n->type );switch(n->type ){case student:new_node->s.grade =n->s.grade ;new_node->s.average = n->s.average ;break;case professor:new_node->annual_salary = n->annual_salary ;break;case staff:new_node->hourly_salary = n->hourly_salary ;}new_node->next = current_node;if(previous==0)root= new_node;elseprevious->next= new_node;}此函数的效果图可以参考图5.2。

/*************************************************************************/ /*函数名称:remove功能描述:删除节点修改记录:*/void list::remove (char * id1){node * current_node= root;node * previous= 0;while(current_node!=0 && strcmp(current_node->ID,id1)<0){previous= current_node;current_node=current_node->next ;}if(current_node!=0 && previous==0){root=current_node->next ;delete current_node;cout<<"身份证号:"<<id1<<"成功删除!"<<endl;}else if(current_node!=0 && previous!=0){previous->next = current_node->next ;delete current_node;cout<<"身份证号:"<<id1<<"成功删除!"<<endl;}elsecout<<"对不起,链表中没有这个人员的信息!"<<endl;}此函数的效果图可以参考图5.3。

相关主题