温存温存3

一、 实验目的
1、 掌握线性表结构、数组描述方法(顺序存储结构)、数组描述线性表的实现。
2、 掌握线性表应用。
二、实验内容
1、题目描述:
设通讯录中每一个联系人的内容有:姓名、电话号码、班级、宿舍。由标准输入读入联系人信息,使用线性表中操作实现通讯录管理功能,包括:插入、删除、编辑、查找(按姓名查找);键盘输入一班级,输出通讯录中该班级中所有人的信息。
每个操作的第一个数为操作数(插入-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 student{
    
    //数组结构为student类型 
	string name;
	string phone;
	int classroom;
	int dormitory;
};

class ARList{
    
    
	private:
		struct student*data;//student结构类型的数组对象 
		int listsize;
		int space;
	public:
		ARList(int n=10);
		~ARList(){
    
    delete []data;}
		void insert(string &name,string &phone,int &classroom,int &dormitory);
		void Delete(string &name);
		void edit1(string &name,string &newphone);
		void edit2(string &name,int &newclass);
		void edit3(string &name,int &newdor);
		int search(string &name);
		int x_or(int &classroom);
			
};
template<class T>
void changelength(T *&a,int oldlength,int newlength){
    
    
	T* temp=new T[newlength];
	int number=newlength<oldlength?newlength:oldlength;
	for(int i=0;i<number;i++){
    
    
		temp[i]=a[i];
	}
	delete []a;
	a=temp;
}

ARList::ARList(int n){
    
    
	data=new student [n];//student类型的数组 
	space=n;
	listsize=0;
}

void ARList::insert(string &name,string &phone,int &classroom,int &dormitory){
    
    
	if(listsize==space){
    
    //扩容 
		changelength(data,space,2*space);
		space=2*space;
	}
	data[listsize].name=name;
	data[listsize].phone=phone;
	data[listsize].classroom=classroom;
	data[listsize].dormitory=dormitory;
	listsize++;
}

void ARList::Delete(string &name){
    
    
	for(int i=0;i<listsize;i++){
    
    
		if(data[i].name==name){
    
    
			for(int j=i;j<listsize-1;j++){
    
    //为防止越栈,只到listsize-1 
				data[j]=data[j+1];
				}
			}
		}
	data[--listsize].~student();//析构最后一个元素 
}

void ARList::edit1(string &name,string &newphone){
    
    
	for(int i=0;i<listsize;i++){
    
    
		if(data[i].name==name){
    
    
			data[i].phone=newphone;
		}
	}
}
void ARList::edit2(string &name,int &newclass){
    
    
	for(int i=0;i<listsize;i++){
    
    
		if(data[i].name==name){
    
    
			data[i].classroom=newclass;
		}
	}	
}
void ARList::edit3(string &name,int &newdor){
    
    
	for(int i=0;i<listsize;i++){
    
    
		if(data[i].name==name){
    
    
			data[i].dormitory=newdor;
		}
	}
}
int ARList::search(string &name){
    
    
	for(int i=0;i<listsize;i++){
    
    
		if(data[i].name==name){
    
    
			return 1;
		}
	}
	return 0;
}
int ARList::x_or(int &classroom){
    
    
	int xorsum=0;
	for(int i=0;i<listsize;i++){
    
    
		if(data[i].classroom==classroom){
    
    
			xorsum^=data[i].dormitory;
		}
	}
	return xorsum;
}
int main(){
    
    
	ARList arlist;
	int n;cin>>n;
	string name,phone,newphone;
	int classroom,dormitory,decision,newclass,newdor;
	int k=0;
	int *a=new int[n];
	for(int i=0;i<n;i++){
    
    
		int x;cin>>x;
		switch(x){
    
    
			case 0:
				cin>>name;cin>>phone;
				cin>>classroom;cin>>dormitory;
				arlist.insert(name,phone,classroom,dormitory);
				break;
			case 1:
				cin>>name;
				arlist.Delete(name);
				break;
			case 2:
				cin>>name;
				cin>>decision;
				if(decision==1){
    
    
					cin>>newphone;
					arlist.edit1(name,newphone);
				}else if(decision==2){
    
    
					cin>>newclass;
					arlist.edit2(name,newclass);
				}else{
    
    
					cin>>newdor;
					arlist.edit3(name,newdor);
				}
				break; 
			case 3:
				cin>>name;
				a[k]=arlist.search(name);
				k++;
				break;
			case 4:
				cin>>classroom;
				a[k]=arlist.x_or(classroom);
				k++;
				break;
			default:
				break;
		}
	}
	for(int i=0;i<k;i++){
    
    
		cout<<a[i]<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_51406030/article/details/121166147
3
3-3