【C++】实现简易通讯录

设计并实现简单通讯录系统

1.定义描述联系人信息的类(数据类)
数据成员:身份证号(常成员)、姓名、手机号(用字符串数组,可能不止一个)、QQ号、微信号、住址;
成员函数:构造函数若干、get/set函数、显示函数。
2.定义功能实现类(操作类)
数据成员:联系人数组(链表也可)、联系人数量、数组容量;
成员函数:
构造函数(完成对本类数据成员的初始化);
增加联系人(在尾部增加);
按身份证号查询联系人并输出找到的联系人信息。找不到,不做任何操作;
按身份证号修改联系人信息(找到,修改全部其他数据。否则,不做任何操作);
按身份证号删除联系人信息;
按“姓”(如姓李)查找所有满足条件的联系人并逐一输出;
析构函数(可不要)

过程

这个系统开发过程遇到了各种各样的问题,我首先想到的是用对象数组来表示操作类的联系人,但是id要求是常对象,构造函数的赋值是个大问题,于是转变思路,不采用数组转而采用单链表,这时又出现问题了,用带头节点的还是不带头的呢?处于数据结构的习惯,我先用带头节点的试一下,但是first的构造函数没法赋初值,所以不得已采用了不带头结点的形式,没有采用结构体而是利用 不使用结构体实现单链表中方法构造单链表,原理是:类的成员可以是其他类的对象,称为类的组合。不能以类自身的对象作为本类的成员。但是可以是本身的指针或者引用。

#include<iostream>
#include<string>

using namespace std;

class Person
{
private:
    const string id;

    string name;
    int n;
    string tel[10];
    string qq;
    string wx;
    string address;
    //Person* first;
    Person* next;

public:
    Person()
    {
        next = NULL;
    }
    Person(string id_in, string name_in, int n_in, string tel[], string qq_in, string wx_in, string address_in);

    Person(const Person& p) ;

    void setName(string input)
    {
        name = input;
    }
    void setQq(string input)
    {
        qq = input;
    }
    void setWx(string input)
    {
        wx = input;
    }
    void setAddress(string input)
    {
        address = input;
    }
    void setNext(Person* input)
    {
        next = input;
    }
    void setTel();
    void setN(int input)
    {
        n = input;
    }
    //void setFirst(Person* input) { first = input; };

    Person* getNext()
    {
        return next;
    }
    //Person* getFirst() { return first; }
    string getId()
    {
        return id;
    }
    string getName()
    {
        return name;
    }
    string getQq()
    {
        return qq;
    }
    string getWx()
    {
        return wx;
    }
    string getAddress()
    {
        return address;
    }
    int getN()
    {
        return n;
    }

    void display();
};

Person::Person(const Person& p):id(p.id)
{

    this->name = p.name;
    this->n = p.n;
    for (int i = 0; i < n; i++)
    {
        this->tel[i] = p.tel[i];
    }
    this->qq = p.qq;
    this->wx = p.wx;
    this->address = p.address;
    next = NULL;

/*
    name = new char[strlen(p.name.c_str()) + 1];
    strcpy(name.c_str(), p.name.c_str());
    string* phone;
    phone = new string[10];
    strcpy(phone->c_str, p.tel->c_str);

    qq = new char[strlen(p.qq.c_str()) + 1];
    strcpy(qq.c_str, p.qq.c_str);
    wx = new char[strlen(p.wx.c_str()) + 1];
    strcpy(wx.c_str, p.wx.c_str);
    address = new char[strlen(p.address.c_str()) + 1];
    strcpy(address.c_str, p.address.c_str);
*/
}


Person::Person(string id_in, string name_in, int n_in, string tel_in[], string qq_in, string wx_in, string address_in) :id(id_in)
{
    this->name = name_in;
    this->n = n_in;
    for (int i = 0; i < n; i++)
    {
        tel[i] = tel_in[i];
    }
    this->qq = qq_in;
    this->wx = wx_in;
    this->address = address_in;

    next = NULL;
}
void Person::display()
{
    cout << getId() << " " << getName() << " " << getQq() << " " << getWx() << " " << getAddress() << endl;
    for (int i = 0; i < n; i++)
    {
        cout << tel[i] << " ";
    }
    cout << endl;
}
void Person::setTel()
{
    for (int i = 0; i < n; i++)
    {
        cin >> tel[i];
    }
}

class Operation
{
private:
    Person* personlist;
    int num;
    int max;
public:
    Operation();
    Operation(int n);
    int getNum()
    {
        return num;
    }
    int getMax()
    {
        return max;
    }
    Person* getList()
    {
        return personlist;
    }
    void add(Person man);
    void findPerson(string id);
    void modify(string id);
    void deletePerson(string id);
    void findName(string name);
    void print();
    ~Operation();
};
Operation::Operation()
{
    //list->setFirst(new Person());
    //list->getFirst()->setNext(NULL);
    personlist = NULL;
    num = 1;
    max = 10;
}
Operation::Operation(int n)
{
    //list->setFirst(new Person());
    //list->getFirst()->setNext(NULL);
    personlist = NULL;
    num = 1;
    max = n;
}

Operation::~Operation()
{
    Person* p;
    while (personlist)
    {
        p = personlist->getNext();
        delete personlist;
        personlist = p;
    }

}

void Operation::print()
{
    Person* p;
    p = personlist;
    while (p != NULL)
    {
        p->display();
        p = p->getNext();
    }

}

void Operation::add(Person man)
{
    if (num < max)
    {
        if (personlist == NULL)
        {
            personlist = &man;
        }
        else
        {
            Person* r, * s, * p;
            //p = list->getFirst();
            p = personlist;
            while (p->getNext() != NULL)
            {
                p = p->getNext();
            }
            r = p;
            s = new Person(man);
            r->setNext(s);
            r = s;
            r->setNext(NULL);
            num++;
        }

    }

    else
    {
        return;
    }

}
void Operation::findPerson(string id)
{
    Person* p;
    //p = list->getFirst()->getNext();
    p = personlist;
    while (p != NULL && id != p->getId())
    {
        p = p->getNext();
    }
    if (p == NULL)
        return;
    else
    {
        p->display();
    }
}
void Operation::modify(string id)
{
    //Person* p = list->getFirst();
    Person* p = personlist;

    while (p != NULL)
    {
        if ((p->getId() == id))
        {
            string name, qq, wx, address;
            int n;

            cin >> name >> qq >> wx >> address;
            cin >> n;
            p->setN(n);
            p->setTel();
            p->setName(name);
            p->setQq(qq);
            p->setWx(wx);
            p->setAddress(address);
            break;
        }
        p = p->getNext();
    }
}
void Operation::deletePerson(string id)
{
    Person* p, * q, * s;
    p = personlist;
    //p = list->getFirst()->getNext();
    int k = 1;
    while (p != NULL && id != p->getId())
    {
        p = p->getNext();
        k++;
    }

    if (k == 1 && p == personlist)
    {
        q = personlist->getNext();
        delete personlist;
        personlist = q;
        num--;
        return;
    }

    else if (k == num)
    {
        s = personlist;
        int i = 0;
        while (i < k - 2)
        {
            s = s->getNext();
            i++;
        }
        s->setNext(NULL);
        delete p;
        num--;
        return;
    }

    else if (p == NULL || p->getNext() == NULL)
        return;

    else
    {
        int j = 0;
        p = personlist;
        //p = list->getFirst();
        while (j < k - 2)
        {
            p = p->getNext();
            j++;
        }
        q = p->getNext();
        p->setNext(q->getNext());
        delete q;
        num--;
    }

}

void Operation::findName(string name)
{
    //Person* p = list->getFirst();
    Person* p = personlist;
    int location = -1;
    while (p != NULL)
    {
        location = p->getName().find(name);
        if (location >= 0)
        {
            p->display();
        }
        p = p->getNext();
    }
}

int main()
{
    string  tel1[1] = { "13863268888" };
    string  tel2[1] = { "13506325555" };
    string  tel3[2] = { "15665286666","17866708888" };
    string  tel4[1] = { "13905389999" };
    string  tel5[3] = { "18663265678","18805316789","17666718808" };
    string  tel6[1] = { "18766706776" };

    Person p1("370102", "张明", 1, tel1, "1212890", "zm000101", "山东济南历下区");
    Person p2("370201", "张强", 1, tel2, "31628976", "wq666", "山东青岛市南区");
    Person p3("370402", "胡宇", 2, tel3, "11209160", "hty56789", "山东枣庄市中区");
    Person p4("370901", "李梅", 1, tel4, "2721722188", "lm_wechat", "山东泰安泰山区");
    Person p5("110106", "张勇", 3, tel5, "99319811", "LiuYong6711", "北京东城区");
    Person p6("310106", "张义", 1, tel6, "3312982", "zysh982", "上海黄埔区");

    p1.display();
    p2.display();
    p3.display();
    p4.display();
    p5.display();
    p6.display();
    cout << "==============" << endl;
    Operation book(8);
    book.add(p1);
    book.add(p2);
    book.add(p3);
    book.add(p4);
    book.add(p5);
    book.add(p6);
    cout << endl;
    cout << book.getNum() << endl;
    book.print();
    book.findPerson("370901");
    book.findPerson("999999");
    book.modify("370102");
    book.print();
    book.modify("999999");
    book.deletePerson("310106");
    cout << endl;
    cout << book.getNum() << endl;
    book.print();

    book.findName("胡");
    book.findName("张");
    book.findName("孙");

}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值