05 设计异质链表实现学校人员管理.docx
《05 设计异质链表实现学校人员管理.docx》由会员分享,可在线阅读,更多相关《05 设计异质链表实现学校人员管理.docx(20页珍藏版)》请在冰豆网上搜索。
05设计异质链表实现学校人员管理
第5章设计异质链表实现学校人员管理
5.5源程序代码
/*****************************************************************************/
/*
模块名称:
12.cpp
功能描述:
这是一个非多态方法实现的异质链表程序
创建人:
修改记录:
*/
#include
#include
#include
//枚举三种节点类型
enumnode_type{student,staff,professor};
//结构体,表示学生的特殊信息
structstudent_type
{
floataverage;//平均分
intgrade;//年级
};
/*************************************************************************/
/*
函数名称:
node
功能描述:
定义类node
修改记录:
*/
classnode
{
friendclasslist;
private:
charname[15];//姓名
charsex[2];//性别
intage;//年龄
charID[20];//身份证号
charaddress[30];//地址
longphone;//电话
node_typetype;//节点类型
//联合,定义单一节点类型
union
{
student_types;
floatannual_salary;
floathourly_salary;
};
node*next;
public:
node(char*name1,char*sex1,intage1,char*id1,char*address1,longphone1,node_typetype1)
{
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
功能描述:
设置节点的类型
修改记录:
*/
voidset_node_type(node_typetype1)
{
type=type1;
}
/*************************************************************************/
/*
函数名称:
set_name
功能描述:
设置姓名
修改记录:
*/
voidset_name(char*name1)
{
strcpy(name,name1);
}
/*************************************************************************/
/*
函数名称:
set_sex
功能描述:
设置性别
修改记录:
*/
voidset_sex(char*sex1)
{
strcpy(sex,sex1);
}
/*************************************************************************/
/*
函数名称:
set_age
功能描述:
设置年龄
修改记录:
*/
voidset_age(intage1)
{
age=age1;
}
/*************************************************************************/
/*
函数名称:
set_ID
功能描述:
设置身份证号
修改记录:
*/
voidset_ID(char*id1)
{
strcpy(ID,id1);
}
/*************************************************************************/
/*
函数名称:
set_address
功能描述:
设置地址
修改记录:
*/
voidset_address(char*address1)
{
strcpy(address,address1);
}
/*************************************************************************/
/*
函数名称:
set_phone
功能描述:
设置电话号码
修改记录:
*/
voidset_phone(longphone1)
{
phone=phone1;
}
/*************************************************************************/
/*
函数名称:
set_average
功能描述:
设置学生的平均分
修改记录:
*/
voidset_average(floataverage1)
{
s.average=average1;
}
/*************************************************************************/
/*
函数名称:
set_grade
功能描述:
设置学生的年级
修改记录:
*/
voidset_grade(intgrade1)
{
s.grade=grade1;
}
/*************************************************************************/
/*
函数名称:
set_annual_salary
功能描述:
设置教授的年薪
修改记录:
*/
voidset_annual_salary(floatsalary)
{
annual_salary=salary;
}
/*************************************************************************/
/*
函数名称:
set_annual_salary
功能描述:
设置教工的小时工资
修改记录:
*/
voidset_hourly_salary(floathsalary)
{
hourly_salary=hsalary;
}
};
/*************************************************************************/
/*
函数名称:
list
功能描述:
list类的定义
修改记录:
*/
classlist
{
private:
node*root;
public:
list()
{
root=0;
}
voidinsert(node*n);
voidremove(char*id1);
voidsearch(char*id1);
voidprint_list();
};
/*************************************************************************/
/*
函数名称:
insert
功能描述:
插入节点
修改记录:
*/
voidlist:
:
insert(node*n)
{
//list以ID为关键字排序,ID从小到大的顺序进行排列
charkey[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)
{
casestudent:
new_node->s.grade=n->s.grade;
new_node->s.average=n->s.average;
break;
caseprofessor:
new_node->annual_salary=n->annual_salary;
break;
casestaff:
new_node->hourly_salary=n->hourly_salary;
}
new_node->next=current_node;
if(previous==0)
root=new_node;
else
previous->next=new_node;
}
此函数的效果图可以参考图5.2。
/*************************************************************************/
/*
函数名称:
remove
功能描述:
删除节点
修改记录:
*/
voidlist:
:
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;
deletecurrent_node;
cout<<"身份证号:
"<"<}
elseif(current_node!
=0&&previous!
=0)
{
previous->next=current_node->next;
deletecurrent_node;
cout<<"身份证号:
"<"<}
else
cout<<"对不起,链表中没有这个人员的信息!
"<}
此函数的效果图可以参考图5.3。
/*************************************************************************/
/*
函数名称:
print_list
功能描述:
显示整个链表
修改记录:
*/
voidlist:
:
print_list()
{
node*cur=root;
while(cur!
=0)
{
cout<<"\t姓名:
\t\t"<name<cout<<"\t性别:
\t\t"<sex<cout<<"\t年龄:
\t\t"<age<cout<<"\t身份证号:
\t"<ID<cout<<"\t地址:
\t\t"<address<cout<<"\t电话号码:
\t"<phone<switch(cur->type)
{
casestudent:
cout<<"\t人员身份:
\t学生"<cout<<"\t平均分:
\t"<s.average<cout<<"\t年级:
\t\t"<s.grade<break;
caseprofessor:
cout<<"\t人员身份:
\t教授"<cout<<"\t年薪:
\t\t"<annual_salary<break;
casestaff:
cout<<"\t人员身份:
\t教工"<cout<<"\t小时工资:
\t"<hourly_salary<break;
}
cur=cur->next;
cout<}
}
此函数的效果图可以参考图5.4。
/*************************************************************************/
/*
函数名称:
search
功能描述:
查询节点信息
修改记录:
*/
voidlist:
:
search(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)
{
cout<<"\t姓名:
\t\t"<name<cout<<"\t性别:
\t\t"<sex<cout<<"\t年龄:
\t\t"<age<cout<<"\t身份证号:
\t"<ID<cout<<"\t地址:
\t\t"<address<cout<<"\t电话号码:
\t"<phone<switch(current_node->type)
{
casestudent:
cout<<"\t人员身份:
\t学生"<cout<<"\t平均分:
\t"<s.average<cout<<"\t年级:
\t\t"<s.grade<break;
caseprofessor:
cout<<"\t人员身份:
\t教授"<cout<<"\t年薪:
\t\t"<annual_salary<break;
casestaff:
cout<<"\t人员身份:
\t教工"<cout<<"\t小时工资:
\t"<hourly_salary<break;
}
}
else
cout<<"对不起,没有找到这个人!
"<}
此函数的效果图可以参考图5.5。
/*************************************************************************/
/*
函数名称:
main
功能描述:
主函数
修改记录:
*/
voidmain()
{
inti=1;
cout<cout<<"----------------------------------------------------------------"<cout<<"**"<cout<<"欢迎进入异质链表的非多态性实现程序"<cout<<"**"<cout<<"-----------------------------------------------------------------"<listpeople;
nodetemp;
charna[15];
charsex[2];
intage;
charID[20];
charadd[30];
longph;
inttype;
floatannual_salary;
floathourly_salary;
floataverage;
intgrade;
while(i)
{
cout<cout<<"请选择您的查询内容:
"<cout<<"1.链表中插入节点;"<cout<<"2.链表中删除节点;"<cout<<"3.显示整个链表;"<cout<<"4.查询链表中的节点;"<cout<<"0.退出;"<cout<<"请选择按键(0-4):
";
cin>>i;
cout<//判断输入,0退出
if(i>=0&&i<=4)
{
switch(i)
{
//case1:
链表中插入节点
case1:
{
cout<<"\t请输入姓名:
";
cin>>na;
cout<<"\t请输入性别:
";
cin>>sex;
cout<<"\t请输入年龄:
";
cin>>age;
cout<<"\t请输入身份证号:
";
cin>>ID;
cout<<"\t请输入家庭地址:
";
cin>>add;
cout<<"\t请输入电话号码:
";
cin>>ph;
cout<<"\t请输入人员类别(0:
student;1:
professor;2:
staff):
";
cin>>type;
//输入三种人员的不同信息
switch(type)
{
//学生信息
case0:
cout<<"\t请输入平均分:
";
cin>>average;
cout<<"\t请输入年级:
";
cin>>grade;
temp.set_average(average);
temp.set_grade(grade);
temp.set_node_type(student);
break;
//教授信息
case1:
cout<<"\t请输入年薪:
";
cin>>annual_salary;
temp.set_annual_salary(annual_salary);
temp.set_node_type(professor);
break;
//教工信息
case2:
cout<<"\t请输入小时工资:
";
cin>>hourly_salary;
temp.set_hourly_salary(hourly_salary);
temp.set_node_type(staff);
break;
}
temp.set_name(na);
temp.set_sex(sex);
temp.set_age(age);
temp.set_ID(ID);
temp.set_address(add);
temp.set_phone(ph);
people.insert(&temp);
break;
}
//删除节点信息
case2:
{
cout<<"请输入要删除的人员的身份证号:
";
cin>>ID;
people.remove(ID);
break;
}
//显示链表所有节点
case3:
people.print_list();
break;
//查询链表中的节点
case4:
cout<<"请输入要查询的人员的身份证号:
";
cin>>ID;
people.search(ID);
break;
}
}
else
cout<<"按键错误,请重新选择!
"<cout<}
}