c++读入string数组_DSA:(三)数组描述线性表

经过前面两次基础知识的铺垫之后,我们正式进入数据结构部分。本文通过通讯录的实现来分析线性表的数组描述。 561c2247fb95f2001f3b86ca5e9518e8.png

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:(重要的事情说三遍)

c5bcd07aeddd28c364d7d2b0eff6bb55.png

GitHub个人博客已经基本搭建完成,内容会和公众号同步更新,欢迎大家没事的时候来随便康康!赞赏和评论功能均已开启!还在等什么! GitHub个人博客已经基本搭建完成,内容会和公众号同步更新,欢迎大家没事的时候来随便康康!赞赏和评论功能均已开启!还在等什么! GitHub个人博客已经基本搭建完成,内容会和公众号同步更新,欢迎大家没事的时候来随便康康!赞赏和评论功能均已开启!还在等什么! And 以后会不定时放送歌单福利无题是指弹永远的经典,更建议听陈亮原版的 (网抑云有版权),上面这个是翻版的,和原版差别不大,但是原版的Am技巧是yyds!!!
All rights reserved.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值