要求
不要使用STL
封装线性表类,提供插入,删除,查找等操作
线性表实现使用数组描述方法(顺序存储结构)
描述
设通讯录中每一个联系人的内容有:姓名、电话号码、班级、宿舍。由标准输入读入联系人信息,使用线性表中操作实现通讯录管理功能,包括:插入、删除、编辑、查找(按姓名查找);键盘输入一班级,输出通讯录中该班级中所有人的信息。
格式
每个操作的第一个数为操作数(插入-0,删除-1,编辑-2,查找-3,输出一个班所有人员信息-4),具体格式如下:
0 姓名 电话 班级 宿舍 插入一条记录
1 姓名 根据姓名删除一条记录
2 姓名 编辑项目 项目新值 根据姓名编辑一条记录(编辑项目为1到3的整数,1代表编辑电话,2代表编辑班级,3代表编辑宿舍)
3 姓名 根据姓名查找,找到输出1,未找到输出0
4 班级 输出该班级的所有成员的宿舍号的异或值
其中查找操作当找到相应的人时输出1,未找到输出0。输出一个班级的人员信息时输出所有成员的宿舍号的异或值。输入数据保证合法。
输入
第一行一个n(1<=n<=20000), 代表接下来操作的数目。接下来n行代表各项操作。
输出
当遇到查找和输出一个班所有人员信息操作时输出。
样例
输入
28
0 Evan 57298577609 1 65
0 WINNIE 37367348390 4 1
3 Evan
4 6
3 WINNIE
1 Evan
4 7
1 WINNIE
3 MARYAM
3 CAMERON
3 TZIVIA
0 OMAR 16447001130 6 55
4 8
4 2
3 JADEN
3 ELIZABETH
2 OMAR 1 79409905568
3 JOSHUA
2 OMAR 1 8978214817
1 OMAR
3 Azaan
3 MARIA
0 HANNAH 94060479192 5 98
3 HEIDY
1 HANNAH
0 Axel 92066832927 3 70
1 Axel
3 TIFFANY
输出
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
限制
1s
#include<iostream>
#include<string>
using namespace std;
struct student
{
string name;
string phone;
int grade;
int dorm;
};
template<class T>
void Changelength(T *&a,int oldlength,int newlength)
{
T *temp=new T[newlength];
int number=min(oldlength,newlength);
copy(a,a+number,temp);
delete []a;
a=temp;
}
class Linearlist
{
public:
Linearlist(int n=10);
~Linearlist() {delete [] stu;}
void insert(string &name,string &phone,int &grade,int &dorm);
void erase(string &name);
void edit1(string& name,string& new_index1);
void edit2(string& name,int decision,int& new_index2);
bool serch(string &name);
int output(int &grade);
private:
struct student*stu;
int capacity;
int listsize;
} ;
Linearlist::Linearlist(int n)
{
stu=new student[n];
capacity=n;
listsize=0;
}
//插入0
void Linearlist::insert(string &name,string &phone,int &grade,int &dorm)
{
if(capacity==listsize)
{
Changelength(stu,capacity,capacity*2);
capacity*=2;
}
stu[listsize].name=name;
stu[listsize].phone=phone;
stu[listsize].grade=grade;
stu[listsize].dorm=dorm;
listsize++;
}
//删除1
void Linearlist::erase(string &name)
{
int i=0;
while(stu[i].name!=name&&i<listsize)
i++;
copy(stu+i+1,stu+listsize,stu+i);
stu[--listsize].~student();//调用析构函数
}
//编辑2
void Linearlist::edit1(string& name,string& new_index1)
{
int i=0;
while(stu[i].name!=name&&i<listsize)
i++;
stu[i].phone=new_index1;
}
void Linearlist::edit2(string& name,int decision,int& new_index2)
{
int i=0;
while(stu[i].name!=name&&i<listsize)
i++;
if(decision==2) stu[i].grade=new_index2;
else stu[i].dorm=new_index2;
}
//查找3
bool Linearlist::serch(string &name)
{
int i=0;
while(stu[i].name!=name&&i<listsize)
i++;
if(i>=listsize)
return 0;
else
return 1;
}
//输出 4
int Linearlist::output(int &grade)
{
int index=0;
for(int i=0;i<listsize;i++)
{
if(stu[i].grade==grade)
index^=stu[i].dorm;
}
return index;
}
int main()
{
int x,n,k=0,j=0;
string name,phone,new_index1;
int decision,new_index2,dorm,grade;
cin>>n;
Linearlist L;
int *a=new int[n];
for(j=0;j<n;j++)
{
cin>>x;
switch(x){
case 0:
cin>>name;
cin>>phone;
cin>>grade;
cin>>dorm;
L.insert(name,phone,grade,dorm);
break;
case 1:
cin>>name;
L.erase(name);
break;
case 2:
cin>>name;
cin>>decision;
if(decision==1)
{
cin>>new_index1;
L.edit1(name,new_index1);
}
else{
cin>>new_index2;
L.edit2(name,decision,new_index2);}
break;
case 3:
cin>>name;
a[k]=L.serch(name);
k++;
break;
case 4:
cin>>grade;
a[k]=L.output(grade);
k++;
break;
default:
break;
}
}
for(int i=0;i<k;i++)
{
cout<<a[i]<<endl;
}
return 0;
}