P1004:通讯录
要求
1.不要使用STL(可以使用string类)。
2.封装线性表类,提供插入,删除,查找等操作。
3.线性表实现使用数组描述方法(顺序存储结构)。
描述
设通讯录中每一个联系人的内容有:姓名、电话号码、班级宿舍。由标准输入读入联系人信息,使用线性表中操作实现通讯录管理功能,包括:插入、删除、编辑、查找(按姓名查找);键盘输入一班级,输出通讯录中该班级中所有人的信息。
格式
每个操作的第一个数为操作数(插入:0,删除:1,编辑:2,查找:3,输出一个班所有人员信息:4),具体格式如下:
0 姓名 电话 班级 宿舍 //插入一条记录1 姓名 //根据姓名删除一条记录2 姓名 编辑项目 项目新值 //根据姓名编辑一条记录(编辑项目为1到3的整数,1代表编辑电话,2代表编辑班级,3代表编辑宿舍)3 姓名 //根据姓名查找,找到输出1,未找到输出04 班级 //输出该班级的所有成员的宿舍号的异或值
其中查找操作当找到相应的人时输出1,未找到输出0。输出一个班级的人员信息时输出所有成员的宿舍号的异或值。输入数据保证合法。
输入
第一行一个n(1<=n<=20000), 代表接下来操作的数目。接下来n行代表各项操作。
输出
当遇到查找和输出一个班所有人员信息操作时输出。
样例
输入
280 Evan 57298577609 1 650 WINNIE 37367348390 4 13 Evan4 63 WINNIE1 Evan4 71 WINNIE3 MARYAM3 CAMERON3 TZIVIA0 OMAR 16447001130 6 554 84 23 JADEN3 ELIZABETH2 OMAR 1 794099055683 JOSHUA2 OMAR 1 89782148171 OMAR3 Azaan3 MARIA0 HANNAH 94060479192 5 983 HEIDY1 HANNAH0 Axel 92066832927 3 701 Axel3 TIFFANY
输出
1010000000000000
限制
1s
算法描述
定义结构体contact,包含姓名、电话号码、班级、宿舍信息。线性表中的每一个元素都是一个结构体,通过结构体可以访问具体的个人信息。
使用顺序存储结构,封装线性表类AddressList,私有成员包括联系人个数contactSize,一维数组的容量listLength,存储联系人的一维数组element。公有成员包括构造函数,复制构造函数,析构函数,以及具体的方法,包括插入一条信息,根据姓名删除一条记录,根据姓名编辑电话,根据姓名编辑班级或宿舍(与根据姓名编辑电话函数形成重载),根据姓名查找,输出班级所有成员宿舍号的异或值。
读入数据时,按行读入,首先读入操作数instruction,根据操作数利用switch分支进行分类,再根据所属操作类别读入对应的数据,调用对应的成员函数,输出数据。
C++实现代码
#include #include #include using namespace std;struct contact{ string name; //姓名 string telephoneNumber; //电话号码 int classNumber; //班级 int dormitoryNumber; //宿舍};class AddressList{private: int contactSize; //联系人的个数 int listLength; //一维数组的容量 contact* element; //存储联系人的一维数组public: AddressList(int initialCapacity=10); //构造函数 AddressList(const AddressList& s); //复制构造函数 ~AddressList(); //析构函数 void insert(string name, string telephoneNumber, int classNumber, int dormitoryNumber); //插入一条记录 void eraser(string name); //根据姓名删除一条记录 void edit(string name, int num, string telephoneNumber); //根据姓名编辑电话 void edit(string name, int num, int Number); //根据姓名编辑班级或宿舍 int search(string name); //根据姓名查找 int outputClass(int classNumber); //输出班级所有成员宿舍号的异或值};AddressList::AddressList(int initialCapacity) //构造函数{ if(initialCapacity<1) //初始容量小于1,抛出异常 { throw invalid_argument("InitialCapacity must be positive."); } listLength=initialCapacity; element=new contact[listLength]; contactSize=0;}AddressList::AddressList(const AddressList& s) //复制构造函数{ listLength=s.listLength; contactSize=s.contactSize; element=new contact[listLength]; for(int i=0;i element[i]=s.element[i];}AddressList::~AddressList() //析构函数{ delete []element;}void AddressList::insert(string name, string telephoneNumber, int classNumber, int dormitoryNumber) //插入一条记录{ if(contactSize==listLength) //数组已满,容量扩大两倍 { contact* Nelement=new contact[listLength*2]; listLength=listLength*2; for(int i=0;i { Nelement[i]=element[i]; } delete []element; element=Nelement; } //在线性表末端(下标为contactSize处)插入一条记录 element[contactSize].name=name; element[contactSize].telephoneNumber=telephoneNumber; element[contactSize].classNumber=classNumber; element[contactSize].dormitoryNumber=dormitoryNumber; contactSize++;}void AddressList::eraser(string name) //根据姓名删除一条记录{ int index=0; //姓名对应的索引 for(int i=0;i { if(element[i].name==name) index=i; } for(int i=index+1;i//向左移动元素 { element[i-1]=element[i]; } element[--contactSize].~contact(); //联系人个数-1,析构无效元素}void AddressList::edit(string name, int num, string telephoneNumber) //根据姓名编辑电话{ for(int i=0;i { if(element[i].name==name) { element[i].telephoneNumber=telephoneNumber; } }}void AddressList::edit(string name, int num, int Number) //根据姓名编辑班级或宿舍{ if(num==2) //编辑班级 { for(int i=0;i { if(element[i].name==name) { element[i].classNumber=Number; } } } else //编辑宿舍 { for(int i=0;i { if(element[i].name==name) { element[i].dormitoryNumber=Number; } } }}int AddressList::search(string name) //根据姓名查找{ for(int i=0;i { if(element[i].name==name) return 1; } return 0;}int AddressList::outputClass(int classNumber) //输出班级所有成员宿舍号的异或值{ int res=0; for(int i=0;i { if(element[i].classNumber==classNumber) { res^=element[i].dormitoryNumber; } } return res;}int main(){ int n;//操作数目 cin>>n; AddressList Contact(10); //创建联系人对象 int instruction; //指令编号 string iName,iTelephone; //读入的姓名、电话信息 int iClass,iDormitory; //读入的班级、宿舍信息 for(int i=0;i { cin>>instruction; switch(instruction) { case 0: //插入一条记录 cin>>iName>>iTelephone>>iClass>>iDormitory; Contact.insert(iName,iTelephone,iClass,iDormitory); break; case 1: //删除一条记录 cin>>iName; Contact.eraser(iName); break; case 2: //根据姓名编辑一条记录 int editNum; cin>>iName>>editNum; if(editNum==1) { cin>>iTelephone; Contact.edit(iName,editNum,iTelephone); } else if (editNum==2) { cin>>iClass; Contact.edit(iName,editNum,iClass); } else { cin>>iDormitory; Contact.edit(iName,editNum,iDormitory); } break; case 3: //根据姓名查找 cin>>iName; cout<endl; break; case 4: //输出班级所有成员宿舍号的异或 cin>>iClass; cout<endl; break; } } return 0;}
结果分析
第一次提交时7个节点通过,3个节点RE,一直找不到错误,然后仔细读代码(大概也就读了十几遍的样子),发现在成员函数insert中,新数组动态申请时使用listLength*2表示新数组的元素个数,之后忘了对listLength扩大两倍(我真是个憨憨),修改后提交通过。
PS:(重要的事情说三遍)
GitHub个人博客已经基本搭建完成,内容会和公众号同步更新,欢迎大家没事的时候来随便康康!赞赏和评论功能均已开启!还在等什么! GitHub个人博客已经基本搭建完成,内容会和公众号同步更新,欢迎大家没事的时候来随便康康!赞赏和评论功能均已开启!还在等什么! GitHub个人博客已经基本搭建完成,内容会和公众号同步更新,欢迎大家没事的时候来随便康康!赞赏和评论功能均已开启!还在等什么! And 以后会不定时放送歌单福利无题是指弹永远的经典,更建议听陈亮原版的 (网抑云有版权),上面这个是翻版的,和原版差别不大,但是原版的Am技巧是yyds!!!
All rights reserved.