山东大学数据结构与算法实验3数组描述线性表(通讯录)

题目描述

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

每个操作的第一个数为操作数(插入-0,删除-1,编辑-2,查找-3,输出一个班所有人员信息-4),具体格式如下:

  • 0 姓名 电话 班级 宿舍 插入一条记录
  • 1 姓名 根据姓名删除一条记录
  • 2 姓名 编辑项目 项目新值 根据姓名编辑一条记录(编辑项目为13的整数,1代表编辑电话,2代表编辑班级,3代表编辑宿舍)
  • 3 姓名 根据姓名查找,找到输出1,未找到输出0
  • 4 班级 输出该班级的所有成员的宿舍号的异或值

其中查找操作当找到相应的人时输出1,未找到输出0。输出一个班级的人员信息时输出所有成员的宿舍号的异或值。输入数据保证合法。

实验要求

  1. 不要使用 STL
  2. 封装线性表类,提供插入,删除,查找等操作
  3. 线性表实现使用数组描述方法(顺序存储结构)

输入输出格式

输入

第一行一个n(1<=n<=20000), 代表接下来操作的数目。接下来n行代表各项操作。

输出

当遇到查找和输出一个班所有人员信息操作时输出。

数据结构与算法描述    

通过结构体数组来储存各个学生的姓名、电话号码、班级、宿舍。在线性表类中,设置三个私有成员,学生的结构体、操作数目、联系人的个数。

struct student{
	string name;
	string phone_number;
	int sclass;//班级
	int dormitory;//宿舍
};

插入函数:直接将输入的数据传入结构体数组中,并让联系人个数加一。

void arrayList::insert() {//插入
	string na;
	string pn;
	int c;
	int d;
	cin >> na >> pn >> c >> d;//输入姓名、电话、班级、宿舍
	stu[snum].name = na;
	stu[snum].phone_number = pn;
	stu[snum].sclass = c;
	stu[snum].dormitory = d;
	snum++;//联系人个数加一
}

删除函数:声明一个theindex用来索引,通过姓名找到位置,然后将该索引之后的联系人向前移动一位,将联系人减一。

void arrayList::erase() {//删除
	string na;
	cin >> na;//输入姓名
	int theindex=0;
	for (int i = 0; i < snum; i++) {//找到该联系人的位置
		if (stu[i].name == na) {
			break;
		}
		else {
			theindex++;
		}
	}
	for (int i = theindex; i < snum-1; i++) {
		stu[i] = stu[i + 1];//将要删掉的联系人后面向前移一位
	}
	snum--;//联系人减一
}

编辑函数:同删除函数一样通过姓名找到位置和索引,然后再通过输入的编辑项目,再编辑结构体数组中相应的数据。

void arrayList::edit() {//编辑
	string na;
	int p;
	cin >> na >> p;//输入姓名、编辑项目
	int theindex = 0;
	for (int i = 0; i < snum; i++) {//找到该联系人位置
		if (stu[i].name == na) {
			break;
		}
		else {
			theindex++;
		}
	}
	if (p == 1) {//如果编辑项目为1,编辑电话
		string pn;
		cin >> pn;
		stu[theindex].phone_number = pn;
	}
	else if (p == 2) {//编辑项目为2,编辑班级
		int c;
		cin >> c;
		stu[theindex].sclass = c;
	}
	else if (p == 3) {//编辑项目为3,编辑宿舍
		int d;
		cin >> d;
		stu[theindex].dormitory = d;
	}
}

查找函数:方法与删除函数类似,多声明了一个变量a初始化为0,便是不存在,如果找到则a=1,最后输出a。

void arrayList::seek() {//查找
	string na;
	cin >> na;//输入姓名
	int theindex = 0;
	int a = 0;//判断是否存在,初始化为0 不存在
	for (int i = 0; i < snum; i++) {
		if (stu[i].name == na) {//如果存在则a为1
			a = 1;
			break;
		}
	}
	cout << a << endl;//输出0或1
}

输出函数:将结构体中班级和输入的班级相等的宿舍号进行求异或,最后输出异或值。

void arrayList::output() {//输出
	int c;
	cin >> c;//输入班级
	int d = 0;
	for (int i = 0; i < snum; i++) {
		if (stu[i].sclass == c) {
			d ^= stu[i].dormitory;//求该班级所有宿舍号的异或值
		}
	}
	cout << d << endl;//输出异或值
}

测试结果

      

完整代码(含注释)

#include<iostream>
using namespace std;
struct student{
	string name;
	string phone_number;
	int sclass;//班级
	int dormitory;//宿舍
};
class arrayList {
public:
	arrayList(int n) {
		num = n;
		stu = new student[n];
	}
	~arrayList() { delete[]stu; }
	void insert();
	void erase();
	void edit();
	void seek();
	void output();
private:
	struct student* stu;
	int num;//操作数目
	int snum = 0;//联系人个数初始化为0
};
void arrayList::insert() {//插入
	string na;
	string pn;
	int c;
	int d;
	cin >> na >> pn >> c >> d;//输入姓名、电话、班级、宿舍
	stu[snum].name = na;
	stu[snum].phone_number = pn;
	stu[snum].sclass = c;
	stu[snum].dormitory = d;
	snum++;//联系人个数加一
}
void arrayList::erase() {//删除
	string na;
	cin >> na;//输入姓名
	int theindex=0;
	for (int i = 0; i < snum; i++) {//找到该联系人的位置
		if (stu[i].name == na) {
			break;
		}
		else {
			theindex++;
		}
	}
	for (int i = theindex; i < snum-1; i++) {
		stu[i] = stu[i + 1];//将要删掉的联系人后面向前移一位
	}
	snum--;//联系人减一
}
void arrayList::edit() {//编辑
	string na;
	int p;
	cin >> na >> p;//输入姓名、编辑项目
	int theindex = 0;
	for (int i = 0; i < snum; i++) {//找到该联系人位置
		if (stu[i].name == na) {
			break;
		}
		else {
			theindex++;
		}
	}
	if (p == 1) {//如果编辑项目为1,编辑电话
		string pn;
		cin >> pn;
		stu[theindex].phone_number = pn;
	}
	else if (p == 2) {//编辑项目为2,编辑班级
		int c;
		cin >> c;
		stu[theindex].sclass = c;
	}
	else if (p == 3) {//编辑项目为3,编辑宿舍
		int d;
		cin >> d;
		stu[theindex].dormitory = d;
	}
}
void arrayList::seek() {//查找
	string na;
	cin >> na;//输入姓名
	int theindex = 0;
	int a = 0;//判断是否存在,初始化为0 不存在
	for (int i = 0; i < snum; i++) {
		if (stu[i].name == na) {//如果存在则a为1
			a = 1;
			break;
		}
	}
	cout << a << endl;//输出0或1
}
void arrayList::output() {//输出
	int c;
	cin >> c;//输入班级
	int d = 0;
	for (int i = 0; i < snum; i++) {
		if (stu[i].sclass == c) {
			d ^= stu[i].dormitory;//求该班级所有宿舍号的异或值
		}
	}
	cout << d << endl;//输出异或值
}
int main() {
	int n;
	cin >> n;//输入操作的数目
	arrayList l(n);
	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;//输入操作数
		if (x == 0) {//0为插入
			l.insert();
		}
		else if (x == 1) {//1为删除
			l.erase();
		}
		else if (x == 2) {//2为编辑
			l.edit();
		}
		else if (x == 3) {//3为查找
			l.seek();
		}
		else if (x == 4) {//4为输出
			l.output();
		}
	}
	
	return 0;
}

如能打赏,不胜感激[叩谢]。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值