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类作为通讯录的容器,通过插入、删除和查找等方法,实现了基本的通讯录功能。
整体而言,这是一个简单但功能完善的通讯录实现,可以作为学习和实践数据结构的一个例子。