下面是详细讲解“C++使用链表存储实现通讯录功能管理”的完整攻略。
概述
使用链表存储数据是一种常见的数据结构,它可以用来存储任意类型的数据,并且可以方便地进行数据的添加、删除和修改等操作。在C++中,我们可以使用指针来实现链表的创建和管理,可以实现很多有用的功能。在本篇教程中,我们将介绍如何使用链表存储联系人信息,并实现通讯录的基本管理。
基本思路
实现一个通讯录管理系统,需要实现以下基本功能:
1. 添加联系人
2. 显示联系人
3. 删除联系人
4. 查找联系人
5. 修改联系人
6. 清空所有联系人
7. 退出系统
我们可以通过创建一个Contact
结构体来存储联系人信息,并使用链表将所有联系人连接起来。具体实现时,我们可以通过不断遍历链表查找指定联系人、删除指定联系人、修改指定联系人等。
代码实现
定义结构体
首先我们需要定义一个Contact
结构体来存储联系人信息。以下是结构体的定义:
struct Contact
{
std::string name; // 姓名
int age; // 年龄
std::string phone; // 电话
std::string addr; // 住址
Contact* next; // 指向下一个节点的指针
};
这个结构体中包含姓名、年龄、电话、住址等联系人基本信息,以及一个指向下一个节点的指针next
。
实现添加联系人
我们可以使用一个链表来存储所有联系人信息,每添加一个联系人,就创建一个新的节点,并将其加入到链表中。以下是添加联系人的代码实现:
void addContact(Contact** head)
{
std::string name;
int age;
std::string phone;
std::string addr;
std::cout << "请输入联系人姓名:";
std::cin >> name;
std::cout << "请输入联系人年龄:";
std::cin >> age;
std::cout << "请输入联系人电话:";
std::cin >> phone;
std::cout << "请输入联系人住址:";
std::cin >> addr;
// 创建新节点
Contact* newContact = new Contact;
newContact->name = name;
newContact->age = age;
newContact->phone = phone;
newContact->addr = addr;
newContact->next = nullptr;
// 将新节点加入链表中
if (*head == nullptr) { // 链表为空,第一个节点
*head = newContact;
}
else { // 链表不为空,遍历到尾部加入节点
Contact* current = *head;
while (current->next != nullptr) {
current = current->next;
}
current->next = newContact;
}
std::cout << "添加联系人成功!\n";
}
这个函数会提示用户输入联系人的基本信息,并创建一个新的节点newContact
将信息存储。如果链表为空(即第一次添加联系人),就将链表头指针head
指向这个新节点。如果链表不为空,就需要遍历链表找到尾部节点,在尾部加入这个新节点。
实现显示联系人
为了查看通讯录中已有的联系人信息,我们需要实现一个函数来显示所有联系人的信息。以下是实现代码:
void showContact(Contact* head)
{
if (head == nullptr) {
std::cout << "通讯录为空!\n";
return;
}
Contact* current = head;
while (current != nullptr) {
std::cout << "姓名:" << current->name << " 年龄:" << current->age
<< " 电话:" << current->phone << " 住址:" << current->addr << "\n";
current = current->next;
}
}
这个函数会检查链表头指针head
是否为空,如果为空说明通讯录中没有任何联系人,直接输出提示信息。如果链表不为空,就遍历整个链表,并输出每个节点的联系人信息。
实现删除联系人
有时我们需要删除一个联系人,例如联系人信息不再有效或联系人已不再需要。以下是删除联系人的实现代码:
void delContact(Contact** head)
{
if (*head == nullptr) {
std::cout << "通讯录为空!\n";
return;
}
std::string name;
std::cout << "请输入要删除的联系人姓名:";
std::cin >> name;
Contact* pre = nullptr;
Contact* current = *head;
while (current != nullptr) {
if (current->name == name) { // 找到指定的联系人
// 删除节点
if (pre == nullptr) { // 删除头节点
*head = current->next;
}
else { // 删除非头节点
pre->next = current->next;
}
delete current;
std::cout << "删除联系人成功!\n";
return;
}
pre = current;
current = current->next;
}
std::cout << "未找到指定的联系人!\n";
}
这个函数会提示用户输入要删除的联系人姓名,然后遍历整个链表,查找是否有这个联系人信息。如果找到指定的联系人节点,就将该节点从链表中删除。需要注意,在删除头节点时,需要更新链表头指针head
;而在删除非头节点时,需要找到该节点的前一个节点,并将其next
指向该节点的下一个节点。
实现查找联系人
我们可以使用一个函数来实现查找指定联系人的功能。以下是查找联系人的实现代码:
void findContact(Contact* head)
{
if (head == nullptr) {
std::cout << "通讯录为空!\n";
return;
}
std::string name;
std::cout << "请输入要查找的联系人姓名:";
std::cin >> name;
Contact* current = head;
while (current != nullptr) {
if (current->name == name) {
std::cout << "姓名:" << current->name << " 年龄:" << current->age
<< " 电话:" << current->phone << " 住址:" << current->addr << "\n";
return;
}
current = current->next;
}
std::cout << "未找到指定的联系人!\n";
}
这个函数会提示用户输入要查找的联系人姓名,然后遍历整个链表,查找是否有这个联系人信息。如果找到指定的联系人节点,就输出该节点的联系人信息。如果遍历结束还未找到指定的联系人,就输出提示信息。
实现修改联系人
我们可以使用另一个函数来实现修改联系人的功能。以下是修改联系人的实现代码:
void modifyContact(Contact* head)
{
if (head == nullptr) {
std::cout << "通讯录为空!\n";
return;
}
std::string name;
std::cout << "请输入要修改的联系人姓名:";
std::cin >> name;
Contact* current = head;
while (current != nullptr) {
if (current->name == name) {
std::cout << "请输入新的联系人信息:\n";
std::string newName;
int newAge;
std::string newPhone;
std::string newAddr;
std::cout << "请输入联系人姓名:";
std::cin >> newName;
std::cout << "请输入联系人年龄:";
std::cin >> newAge;
std::cout << "请输入联系人电话:";
std::cin >> newPhone;
std::cout << "请输入联系人住址:";
std::cin >> newAddr;
// 更新联系人信息
current->name = newName;
current->age = newAge;
current->phone = newPhone;
current->addr = newAddr;
std::cout << "修改联系人成功!\n";
return;
}
current = current->next;
}
std::cout << "未找到指定的联系人!\n";
}
这个函数会提示用户输入要修改的联系人姓名,然后遍历整个链表,查找是否有这个联系人信息。如果找到指定的联系人节点,就提示用户输入新的联系人信息,并更新该节点的联系人信息。如果遍历结束还未找到指定的联系人,就输出提示信息。
实现清空所有联系人
为了清空所有联系人,我们需要删除整个链表。以下是清空所有联系人的实现代码:
void clearContact(Contact** head)
{
Contact* current = *head;
while (current != nullptr) {
*head = (*head)->next;
delete current;
current = *head;
}
*head = nullptr;
std::cout << "清空所有联系人成功!\n";
}
这个函数会遍历整个链表,删除每个节点,并将链表头指针head
设置为nullptr
,即表示通讯录中没有任何联系人。
完整示例
以上就是实现通讯录管理的主要代码实现。以下是完整的示例代码,包括以上实现的所有函数和主程序入口:
```c++
include
include
struct Contact
{
std::string name; // 姓名
int age; // 年龄
std::string phone; // 电话
std::string addr; // 住址
Contact* next; // 指向下一个节点的指针
};
void addContact(Contact** head)
{
std::string name;
int age;
std::string phone;
std::string addr;
std::cout << "请输入联系人姓名:";
std::cin >> name;
std::cout << "请输入联系人年龄:";
std::cin >> age;
std::cout << "请输入联系人电话:";
std::cin >> phone;
std::cout << "请输入联系人住址:";
std::cin >> addr;
// 创建新节点
Contact* newContact = new Contact;
newContact->name = name;
newContact->age = age;
newContact->phone = phone;
newContact->addr = addr;
newContact->next = nullptr;
// 将新节点加入链表中
if (*head == nullptr) { // 链表为空,第一个节点
*head = newContact;
}
else { // 链表不为空,遍历到尾部加入节点
Contact* current = *head;
while (current->next != nullptr) {
current = current->next;
}
current->next = newContact;
}
std::cout << "添加联系人成功!\n";
}
void showContact(Contact* head)
{
if (head == nullptr) {
std::cout << "通讯录为空!\n";
return;
}
Contact* current = head;
while (current != nullptr) {
std::cout << "姓名:" << current->name << " 年龄:" << current->age
<< " 电话:" << current->phone << " 住址:" << current->addr << "\n";
current = current->next;
}
}
void delContact(Contact* head)
{
if (head == nullptr) {
std::cout << "通讯录为空!\n";
return;
}
std::string name;
std::cout << "请输入要删除的联系人姓名:";
std::cin >> name;
Contact* pre = nullptr;
Contact* current = *head;
while (current != nullptr) {
if (current->name == name) { // 找到指定的联系人
// 删除节点
if (pre == nullptr) { // 删除头节点
*head = current->next;
}
else { // 删除非头节点
pre->next = current->next;
}
delete current;
std::cout << "删除联系人成功!\n";
return;
}
pre = current;
current = current->next;
}
std::cout << "未找到指定的联系人!\n";
}
void findContact(Contact* head)
{
if (head == nullptr) {
std::cout << "通讯录为空!\n";
return;
}
std::string name;
std::cout << "请输入要查找的联系人姓名:";
std::cin >> name;
Contact* current = head;
while (current != nullptr) {
if (current->name == name) {
std::cout << "姓名:" << current->name << " 年龄:" << current->age
<< " 电话:" << current->phone << " 住址:" << current->addr << "\n";
return;
}
current = current->next;
}
std::cout << "未找到指定的联系人!\n";
}
void modifyContact(Contact* head)
{
if (head == nullptr) {
std::cout << "通讯录为空!\n";
return;
}
std::string name;
std::cout << "请输入要修改的联系人姓名:";
std::cin >> name;
Contact* current = head;
while (current != nullptr) {
if (current->name == name) {
std::cout << "请输入新的联系人信息:\n";
std::string newName;
int newAge;
std::string newPhone;
std::string newAddr;
std::cout << "请输入联系人姓名:";
std::cin >> newName;
std::cout << "请输入联系人年龄:";
std::cin >> newAge;
std::cout << "请输入联系人电话:";
std::cin >> newPhone;
std::cout << "请输入联系人住址:";
std::cin >> newAddr;
// 更新联系人信息
current->name = newName;
current->age = newAge;
current->phone = newPhone;
current->addr = newAddr;
std::cout << "修改联系人成功!\n";
return;
}
current = current->next;
}
std::cout << "未找到指定的联系人!\n";
}
void clearContact(Contact head)
{
Contact current = head;
while (current != nullptr) {
head = (head)->next;
delete current;
current = head;
}
head = nullptr;
std::cout << "清空所有联系人成功!\n";
}
int main()
{
Contact* head = nullptr;
int choice;
do {
std::cout << "=====================通讯录管理系统========================\n";
std::cout << "1.添加联系人\n";
std::cout << "2.显示所有联系人\n";
std::cout << "3.删除指定联系人\n";
std::cout << "4.查找指定联系人\n";
std::cout << "5.修改指定联系人\n";
std::cout << "6.清空所有联系人\n";
std::cout << "0.退出通讯录\n";
std::cout << "===========================================================\n";
std::cout << "请选择功能:";
std::cin >> choice;
switch (choice) {
case 1:
addContact(&head);
break;
case 2:
showContact(head);
break;
case 3:
delContact(&head);
break;
case 4:
findContact(head);
break;
case 5:
modifyContact(head);
break;
case 6:
clearContact(&head);
break;
case 0:
std::cout << "欢迎下次使用通讯录管理系统!\n";
break;
default:
std::cout << "无效的选择,请重新输入!\n";
break;
}
std::cout << "\n";
} while
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++使用链表存储实现通讯录功能管理 - Python技术站