要求
- 不要使用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 tel;
int cla;
int dor;
};
// 插入、查找、输出、删除
// template<class T>
class arrayList{
public:
arrayList(int n = 10);// 构造函数
~arrayList(){delete []stu;}; // 析构函数
void insert(string &name,string &tel,int &cla,int &dor); // 插入
void erase(string &name); // 删除
void edit(string &name); // 编辑
int search(string &name); // 寻找
int output(int &cla); // 输出
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;
}
private:
struct student *stu;
int capacity;
int listsize;
};
// template<class T> // 构造函数
arrayList::arrayList(int n){
stu = new student[n];
capacity = 10;
listsize = 0;
}
// template<class T> // 插入
void arrayList::insert(string &name,string &tel,int &cla,int &dor){
if(listsize == capacity){
changeLength(stu, capacity, capacity * 2);
capacity = capacity * 2;
}
stu[listsize].name = name;
stu[listsize].tel = tel;
stu[listsize].cla = cla;
stu[listsize].dor = dor;
listsize++;
}
// template<class T> // 删除
void arrayList::erase(string &name){
int i = 0;
for(; i < listsize; i++){
if(name == stu[i].name){
break;
}
}
for(i++; i < listsize; i++){
stu[i-1].name = stu[i].name;
stu[i-1].tel = stu[i].tel;
stu[i-1].cla = stu[i].cla;
stu[i-1].dor = stu[i].dor;
}
listsize--;
}
// template<class T> // 查询
int arrayList::search(string &name){
int i = 0;
for(; i < listsize; i++){
if(stu[i].name == name){
break;
}
}
if(i == listsize){
return 0;
}
else{
return 1;
}
}
// template<class T> // 编辑
void arrayList::edit(string &name){
int i = 0;
for(; i < listsize; i++){
if(stu[i].name == name){
break;
}
}
int x = 0;
cin >> x;
switch(x){
case 1: {string w; cin >> w; stu[i].tel = w;}break;
case 2: {int d; cin >> d; stu[i].cla = d;}break;
case 3: {int e; cin >> e; stu[i].dor = e;}break;
default:
break;
}
}
// template<class T> // 输出
int arrayList::output(int &cla){
int x = 0;
for(int i = 0; i < listsize; i++){
if(stu[i].cla == cla){
x = x ^ stu[i].dor;
}
}
return x;
}
int main(){
int q;
cin >> q; // 输入操作数
arrayList l;
string name, tel;
int cla, dor;
int *h=new int[q];
int k = 0;
for(int i = 0; i < q; i++){
int x = 0;
cin >> x;
switch(x){
case 0: {cin >> name >> tel >> cla >> dor; l.insert(name, tel, cla, dor);}break;
case 1: {string b; cin >> b; l.erase(b);}break;
case 2: {string b; cin >> b; l.edit(b);}break;
case 3: {string b; cin >> b; h[k] = l.search(b); k++;} break;
case 4: {int g; cin >> g; h[k]=l.output(g);k++;}break;
default:
break;
}
}
for(int i = 0; i < k; i++){
cout << h[i] << endl;
}
return 0;
}