实验内容:
设通讯录中每一个联系人的内容有:姓名、电话号码、班级、宿舍。由标准输入读入联系人信息,使用线性表中操作实现通讯录管理功能,包括:插入、删除、编辑、查找(按姓名查找);键盘输入一班级,输出通讯录中该班级中所有人的信息。
每个操作的第一个数为操作数(插入-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 inform {//定义结构体用来存放学生信息
string name;
long long tele;
long long classnum;
long long dorm;
};
class stlist {//学生信息线性表类
public:
void set(int n, inform* l);
void insert(string n, long long t, long long c, long long d);
void dele(string n);
int search(string n);
void manul(string name, int s, long long New);
long long output(long long target);
~stlist() {
delete[] L;
}
private:
int length;
int adress;
inform* L;
};
void stlist::set(int n, inform* l) {//初始化线性表
length = n;
adress = 0;//adress是实际长度
L = l;
}
void stlist::insert(string n, long long t, long long c, long long d) {//插入一个学生信息
L[adress].classnum = c;
L[adress].dorm = d;
L[adress].name = n;
L[adress].tele = t;
adress++;
}
void stlist::dele(string n) {//删除一个学生
int i;
for (i = 0; i < adress; i++) {
if (L[i].name == n) break;
}
copy(L + i + 1, L + adress, L + i);//使用copy把这个学生后面的学生向前移动一位
adress--;
}
int stlist::search(string n) {//查找一个学生
int i;
for (i = 0; i < adress; i++) {
if (L[i].name == n) {
return 1;
}
}
return 0;
}
void stlist::manul(string n, int s, long long New) {//操作函数
int i;
for (i = 0; i < adress; i++) {
if (L[i].name == n) {
if (s == 1) L[i].tele = New;
else if (s == 2) L[i].classnum = New;
else if (s == 3) L[i].dorm = New;
}
}
}
long long stlist::output(long long target) {//返回异或值
long long sum = 0;
int i;
for (i = 0; i < adress; i++) {
if (L[i].classnum == target) sum = sum ^ L[i].dorm;
}
return sum;
}
int main() {
int n;
cin >> n;
inform* a = new inform[n];
stlist b;
b.set(n, a);
int key;
string name; int s;
long long c, d, New, target, t;//参数名与上面函数体中的基本一致
for (int j = 0; j < n; j++) {
cin >> key;
switch (key) {
case 0:
cin >> name >> t >> c >> d;
b.insert(name, t, c, d);
break;
case 1:
cin >> name;
b.dele(name);
break;
case 2:
cin >> name >> s >> New;
b.manul(name, s, New);
break;
case 3:
cin >> name;
cout << b.search(name) << endl;
break;
case 4:
cin >> target;
cout << b.output(target) << endl;
break;
}
}
return 0;
}