c语言编程笔录

您现在的位置是:首页 > C语言 > C#

C#

C++双向链表实现简单通讯录

李育泉 2023-08-09C#
前言在本问题中,我们需要使用C++实现一个简单的通讯录,这个通讯录要能够存储联系人的信息并进行增删改查等操作。为了实现这个功能,我们可以使用双向链表数据结构来存储联系人信息,并编写相

前言

在本问题中,我们需要使用C++实现一个简单的通讯录,这个通讯录要能够存储联系人的信息并进行增删改查等操作。为了实现这个功能,我们可以使用双向链表数据结构来存储联系人信息,并编写相应的代码来完成通讯录的功能。

设计思路

我们可以将通讯录中的每个联系人看作一个节点,每个节点包含姓名、电话等信息,并且还需要保存前驱和后继节点的指针,以实现双向链表的特性。

首先,我们需要定义一个Contact类来表示每个联系人的信息,包括姓名和电话等属性。然后,我们可以定义一个ContactNode类作为节点的模板,其中包含一个指向Contact对象的指针,以及指向前驱和后继节点的指针。

接下来,我们可以定义一个ContactList类作为通讯录的容器,其中包含头节点和尾节点的指针,以及一些基本的操作方法,如插入、删除、查找等。

代码实现

#include 
#include 

using namespace std;

// 联系人类
class Contact {
    public:
        string name;
        string phone;
};

// 联系人节点类
class ContactNode {
    public:
        Contact* contact;
        ContactNode* prev;
        ContactNode* next;
};

// 通讯录类
class ContactList {
    public:
        ContactNode* head;
        ContactNode* tail;

        // 构造函数
        ContactList() {
            head = NULL;
            tail = NULL;
        }

        // 插入联系人
        void insertContact(string name, string phone) {
            Contact* newContact = new Contact();
            newContact->name = name;
            newContact->phone = phone;

            ContactNode* newNode = new ContactNode();
            newNode->contact = newContact;

            if (head == NULL) {
                head = newNode;
                tail = newNode;
            } else {
                newNode->next = head;
                head->prev = newNode;
                head = newNode;
            }
        }
        
        // 删除联系人
        void deleteContact(string name) {
            ContactNode* currentNode = head;
            while (currentNode != NULL) {
                if (currentNode->contact->name == name) {
                    if (currentNode == head) {
                        head = currentNode->next;
                    } else if (currentNode == tail) {
                        tail = currentNode->prev;
                    } else {
                        currentNode->prev->next = currentNode->next;
                        currentNode->next->prev = currentNode->prev;
                    }
                    
                    delete currentNode;
                    break;
                }
                
                currentNode = currentNode->next;
            }
        }
        
        // 查找联系人
        void searchContact(string name) {
            ContactNode* currentNode = head;
            while (currentNode != NULL) {
                if (currentNode->contact->name == name) {
                    cout << "姓名:" << currentNode->contact->name << ",电话:" << currentNode->contact->phone << endl;
                    break;
                }
                
                currentNode = currentNode->next;
            }

            if (currentNode == NULL) {
                cout << "联系人不存在" << endl;
            }
        }
};

int main() {
    ContactList contactList;

    contactList.insertContact("张三", "123456789");
    contactList.insertContact("李四", "987654321");
    
    contactList.searchContact("张三");
    contactList.deleteContact("张三");
    contactList.searchContact("张三");
}

解释和规范

以上代码中,我们首先定义了Contact类来表示每个联系人的信息,包括姓名和电话。然后,我们定义了ContactNode类来作为节点模板,其中包含一个指向Contact对象的指针,以及指向前驱和后继节点的指针。

接着,我们定义了ContactList类作为通讯录的容器,其中包含头节点和尾节点的指针,以及一些基本的操作方法,例如插入联系人、删除联系人和查找联系人等。

在主函数中,我们创建了一个ContactList对象,并使用insertContact方法插入了两个联系人,然后使用searchContact方法进行查找,最后使用deleteContact方法删除了一个联系人。

总结

通过使用双向链表的数据结构,在C++中实现了一个简单的通讯录功能。通过定义Contact类和ContactNode类分别表示联系人的信息和节点模板,我们可以方便地进行增删改查等操作。

此外,我们还定义了ContactList类作为通讯录的容器,通过插入、删除和查找等方法,实现了基本的通讯录功能。

整体而言,这是一个简单但功能完善的通讯录实现,可以作为学习和实践数据结构的一个例子。

文章评论