山东大学数据结构实验三

文章描述了一个使用C++编程语言实现的通讯录管理系统,该系统基于线性表的顺序存储结构,不使用STL。功能包括插入、删除、查找和编辑联系人信息,以及按班级输出宿舍号的异或值。系统通过键盘输入进行操作,对合法输入进行处理。
摘要由CSDN通过智能技术生成

通讯录

要求

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

描述

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

格式

每个操作的第一个数为操作数(插入-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

/* created by LYZ */
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const int N=2e4+10;
int b[N];//定义一个长度为20010的数组,用来记录输出的每一个数 
int stand=0;//定义stand表示要输出的第stand+1个数 
struct student{
	public: 
	string name;
	string phoneNum;
	int classId;
	int bedRoomId;
};
template<class T>
void changeLength1D(T*& a, int oldLength, int newLength){
	T *temp = new T[newLength]; //新数组
	int number = oldLength<newLength?oldLength:newLength; //需要复制的元素个数
	for(int i=0;i<number;i++)
	temp[i]=a[i];
	delete[] a; //释放老数组的内存空间
	a = temp;
}
class Person{
public:
	Person(int initialSize = 10);
	~Person(){ delete[]a; }
	void insert(string thename, string phoneNum, int classId, int bedroomId);
	void erase(string thename);
    void edit(string thename); 
    bool find(string thename);
    int  sum(int grade) ;
private:
	int arrayLength;
	int listSize;
	 student* a;
};
 Person::Person(int initialCapacity){ 
		arrayLength = initialCapacity;
		a = new student[arrayLength];
		listSize = 0;
	}
void Person::insert(string thename, string thephoneNum, int theclassId, int thebedroomId){
	
	if (arrayLength == listSize){
		changeLength1D(a, arrayLength, 2 * arrayLength);
		arrayLength = arrayLength * 2;
	}
	a[listSize].name = thename;
	a[listSize].phoneNum = thephoneNum;
	a[listSize].classId = theclassId;
	a[listSize].bedRoomId = thebedroomId;
	listSize++;
}
void Person::erase(string thename)
{
	int index;
	for (int i = 0; i < listSize; i++){
		if (a[i].name == thename){ index = i; break; }
	}
	for (int i = index+1; i < listSize; i++)
	{
		a[i-1] = a[i];
	}
	a[--listSize].~student();
}
void Person::edit(string thename){
	int index;
	for (int i = 0; i < listSize; i++){
		if (a[i].name == thename){ index = i; break; }
	}
	int flag;
	cin>>flag;
	if(flag==1){
		string newphonenum;
		cin>>newphonenum;
		a[index].phoneNum=newphonenum;
	}else if(flag==2){
		int newclassId;
		cin>>newclassId;
		a[index].classId=newclassId;
	}
	else if(flag==3){
		int newRoomId;
		cin>>newRoomId;
		a[index].bedRoomId=newRoomId; 
	}
}
bool Person::find(string thename){
	
	int i;
	for( i=0;i<listSize;i++){
		if(a[i].name==thename){
	break;}
	}
	if(i==listSize)return 0;
	else return 1;
}
int Person::sum(int grade){
	
	
int res=0;
	for(int i=0;i<listSize;i++)   
	{
		if(a[i].classId==grade)
			res^=a[i].bedRoomId;
	}
	return res;
}
int main()
{
	string name;
	string phoneNum;
	int classId;
	int bedRoomId;
	Person person;
	int flag;
	int n;//用来控制运行哪个命令
	cin >> n;
	for (int i = 0; i < n;i++){
		cin >> flag;
		switch (flag)
		{case 0:
			cin >> name;
			cin >> phoneNum;
			cin >> classId;
			cin >> bedRoomId;
			person.insert(name, phoneNum, classId, bedRoomId);
			break;
		case 1:
		{
				cin>>name;
			person.erase(name);
			break;}
		case 2:
			{
			string findname;cin>>findname;
			person.edit(findname);
			break;}
		case 3:
			{
			string findname2;
			cin>>findname2;
            if(person.find(findname2)){b[stand]=1;
            stand++;
			}
            else {b[stand]=0;stand++;
            }
			break;}
		case 4:{
		int grade;
		cin>>grade;
	    
		 b[stand]=person.sum(grade);
		  stand++;
			break;
	
		}
}

	}
	for(int i=0;i<stand;i++)
	cout<<b[i]<<endl; 
return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咕噜咕噜咕噜128

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值