数据结构实验3

要求
不要使用STL
封装线性表类,提供插入,删除,查找等操作
线性表实现使用数组描述方法(顺序存储结构)
描述
设通讯录中每一个联系人的内容有:姓名、电话号码、班级、宿舍。由标准输入读入联系人信息,使用线性表中操作实现通讯录管理功能,包括:插入、删除、编辑、查找(按姓名查找);键盘输入一班级,输出通讯录中该班级中所有人的信息。
格式
每个操作的第一个数为操作数(插入-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

#include<iostream>
#include<string>
using namespace std;
struct student
{
	string name;
	string phone;
	int grade;
	int dorm;
 }; 
template<class T>
void Changelength(T *&a,int oldlength,int newlength)
{
	T *temp=new T[newlength];
	int number=min(oldlength,newlength);
	copy(a,a+number,temp);
	delete []a;
	a=temp;
 } 
class Linearlist
{
	public:
		Linearlist(int n=10);
		~Linearlist() {delete [] stu;}
		void insert(string &name,string &phone,int &grade,int &dorm);
		void erase(string &name);
		void edit1(string& name,string& new_index1);
		void edit2(string& name,int decision,int& new_index2);
		bool serch(string &name);
		int output(int &grade);
	private:
		struct student*stu;
		int capacity;
		int listsize;
 } ;
Linearlist::Linearlist(int n)
{
	stu=new student[n];
	capacity=n;
	listsize=0;
}
//插入0 
void Linearlist::insert(string &name,string &phone,int &grade,int &dorm)
{
	if(capacity==listsize)
	{
		Changelength(stu,capacity,capacity*2);
		capacity*=2;
	}
	stu[listsize].name=name;
	stu[listsize].phone=phone;
	stu[listsize].grade=grade;
	stu[listsize].dorm=dorm;
	listsize++;
}
//删除1
void Linearlist::erase(string &name)
{
	int i=0;
	
	while(stu[i].name!=name&&i<listsize)
		i++;
	copy(stu+i+1,stu+listsize,stu+i);
	stu[--listsize].~student();//调用析构函数 
 } 
//编辑2
void Linearlist::edit1(string& name,string& new_index1)
{
	int i=0;
	
	while(stu[i].name!=name&&i<listsize)
		i++;
    stu[i].phone=new_index1;
	
}
void Linearlist::edit2(string& name,int decision,int& new_index2)
{
	int i=0;
	
	while(stu[i].name!=name&&i<listsize)
		i++;
	if(decision==2) stu[i].grade=new_index2;
	else stu[i].dorm=new_index2;
}
//查找3
bool Linearlist::serch(string &name) 
{
	int i=0;
	
	while(stu[i].name!=name&&i<listsize)
		i++;
	
	if(i>=listsize)
		return 0;
	else
		return 1;
}
//输出 4
int Linearlist::output(int &grade)
{
	int index=0;
	for(int i=0;i<listsize;i++)   
	{
		if(stu[i].grade==grade)
			index^=stu[i].dorm;
	}
	return index;
}
int main()
{
	
	int x,n,k=0,j=0;
	string name,phone,new_index1;
	int decision,new_index2,dorm,grade;
	cin>>n;
	Linearlist L;
	int *a=new int[n];
	for(j=0;j<n;j++)
	{
	cin>>x;	
	switch(x){
	case 0:
			cin>>name;
			cin>>phone;
			cin>>grade;
			cin>>dorm;
			L.insert(name,phone,grade,dorm); 
			break;
	case 1:
			cin>>name;
			L.erase(name);
			break;
	case 2:
			cin>>name;
			cin>>decision;
			if(decision==1)
			{
				cin>>new_index1;
		    	L.edit1(name,new_index1);
		    }
			else{
				cin>>new_index2;
				L.edit2(name,decision,new_index2);}
			break;
    case 3:
			cin>>name;
		    a[k]=L.serch(name);
		    k++;
			break;
	case 4:
			cin>>grade;
			a[k]=L.output(grade);
			k++;
			break;
	default: 
		break;
 }
}
 for(int i=0;i<k;i++)
 {
 	cout<<a[i]<<endl;
 }
 return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值