Vijos数据结构基础C++实验整理(三)——数组描述线性表

实验内容:
设通讯录中每一个联系人的内容有:姓名、电话号码、班级、宿舍。由标准输入读入联系人信息,使用线性表中操作实现通讯录管理功能,包括:插入、删除、编辑、查找(按姓名查找);键盘输入一班级,输出通讯录中该班级中所有人的信息。
每个操作的第一个数为操作数(插入-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;
}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值