一、 实验目的
1、 掌握线性表结构、数组描述方法(顺序存储结构)、数组描述线性表的实现。
2、 掌握线性表应用。
二、实验内容
1、题目描述:
设通讯录中每一个联系人的内容有:姓名、电话号码、班级、宿舍。由标准输入读入联系人信息,使用线性表中操作实现通讯录管理功能,包括:插入、删除、编辑、查找(按姓名查找);键盘输入一班级,输出通讯录中该班级中所有人的信息。
每个操作的第一个数为操作数(插入-0,删除-1,编辑-2,查找-3,输出一个班所有人员信息-4),具体格式如下:
0 姓名 电话 班级 宿舍 插入一条记录
1 姓名 根据姓名删除一条记录
2 姓名 编辑项目 项目新值 根据姓名编辑一条记录(编辑项目为1到3的整数,1,代表编辑电话,2代表编辑班级,3代表编辑宿舍)
3 姓名 根据姓名查找,找到输出1,未找到输出0
4 班级 输出该班级的所有成员的宿舍号的异或值
其中查找操作当找到相应的人时输出1,未找到输出0。输出一个班级的人员信息时输出所有成员的宿舍号的异或值。输入数据保证合法。
输入输出格式:
输入:
第一行一个n(1<=n<=20000), 代表接下来操作的数目。接下来n行代表各项操作。
输出:
当遇到查找和输出一个班所有人员信息操作时输出。
#include<iostream>
#include<string>
using namespace std;
struct student{
//数组结构为student类型
string name;
string phone;
int classroom;
int dormitory;
};
class ARList{
private:
struct student*data;//student结构类型的数组对象
int listsize;
int space;
public:
ARList(int n=10);
~ARList(){
delete []data;}
void insert(string &name,string &phone,int &classroom,int &dormitory);
void Delete(string &name);
void edit1(string &name,string &newphone);
void edit2(string &name,int &newclass);
void edit3(string &name,int &newdor);
int search(string &name);
int x_or(int &classroom);
};
template<class T>
void changelength(T *&a,int oldlength,int newlength){
T* temp=new T[newlength];
int number=newlength<oldlength?newlength:oldlength;
for(int i=0;i<number;i++){
temp[i]=a[i];
}
delete []a;
a=temp;
}
ARList::ARList(int n){
data=new student [n];//student类型的数组
space=n;
listsize=0;
}
void ARList::insert(string &name,string &phone,int &classroom,int &dormitory){
if(listsize==space){
//扩容
changelength(data,space,2*space);
space=2*space;
}
data[listsize].name=name;
data[listsize].phone=phone;
data[listsize].classroom=classroom;
data[listsize].dormitory=dormitory;
listsize++;
}
void ARList::Delete(string &name){
for(int i=0;i<listsize;i++){
if(data[i].name==name){
for(int j=i;j<listsize-1;j++){
//为防止越栈,只到listsize-1
data[j]=data[j+1];
}
}
}
data[--listsize].~student();//析构最后一个元素
}
void ARList::edit1(string &name,string &newphone){
for(int i=0;i<listsize;i++){
if(data[i].name==name){
data[i].phone=newphone;
}
}
}
void ARList::edit2(string &name,int &newclass){
for(int i=0;i<listsize;i++){
if(data[i].name==name){
data[i].classroom=newclass;
}
}
}
void ARList::edit3(string &name,int &newdor){
for(int i=0;i<listsize;i++){
if(data[i].name==name){
data[i].dormitory=newdor;
}
}
}
int ARList::search(string &name){
for(int i=0;i<listsize;i++){
if(data[i].name==name){
return 1;
}
}
return 0;
}
int ARList::x_or(int &classroom){
int xorsum=0;
for(int i=0;i<listsize;i++){
if(data[i].classroom==classroom){
xorsum^=data[i].dormitory;
}
}
return xorsum;
}
int main(){
ARList arlist;
int n;cin>>n;
string name,phone,newphone;
int classroom,dormitory,decision,newclass,newdor;
int k=0;
int *a=new int[n];
for(int i=0;i<n;i++){
int x;cin>>x;
switch(x){
case 0:
cin>>name;cin>>phone;
cin>>classroom;cin>>dormitory;
arlist.insert(name,phone,classroom,dormitory);
break;
case 1:
cin>>name;
arlist.Delete(name);
break;
case 2:
cin>>name;
cin>>decision;
if(decision==1){
cin>>newphone;
arlist.edit1(name,newphone);
}else if(decision==2){
cin>>newclass;
arlist.edit2(name,newclass);
}else{
cin>>newdor;
arlist.edit3(name,newdor);
}
break;
case 3:
cin>>name;
a[k]=arlist.search(name);
k++;
break;
case 4:
cin>>classroom;
a[k]=arlist.x_or(classroom);
k++;
break;
default:
break;
}
}
for(int i=0;i<k;i++){
cout<<a[i]<<endl;
}
return 0;
}