C++使用链表存储实现通讯录功能管理

yizhihongxing

下面是详细讲解“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技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • HTC One M7 刷机图文教程 一键刷Recovery教程

    HTC One M7 刷机图文教程 准备工作 安装ADB与Fastboot驱动:下载ADB驱动和Fastboot驱动,解压后将解压出来的文件保存到电脑本地任意目录下,比如C:\Android\ 下载需要刷入HTC One M7的Recovery镜像文件。可以在网络上查找并下载,比如TWRP Recovery. 对手机解锁Bootloader。在手机开机状态下…

    other 2023年6月27日
    00
  • win7系统右键怎么添加管理员权限?

    如何在win7系统中添加管理员权限到右键菜单? 在win7系统中,执行某些操作需要管理员权限,如安装软件,更改系统设置等。如果经常需要这样的操作,手动打开管理员权限比较繁琐,可以将管理员权限添加到右键菜单中,以便快速打开。 方法1:使用注册表编辑器添加管理员权限 按下键盘上的“Win+R”键,打开“运行”窗口。 输入“regedit”并按下“Enter”键,…

    other 2023年6月27日
    00
  • SpringBoot 如何编写配置文件

    关于“SpringBoot 如何编写配置文件”的攻略,通常会从以下几个方面来进行讲解: 配置文件的类型和位置 配置文件的基本格式和语法规则 如何加载和使用配置文件 配置文件中的常用配置项和示例 接下来,我会针对这些方面进行一一介绍。 配置文件的类型和位置 SpringBoot 支持多种类型的配置文件,包括 .properties 和 .yml 两种,它们的位…

    other 2023年6月25日
    00
  • 魔兽世界7.3.5戒律牧怎么堆属性 wow7.35戒律牧配装属性优先级攻略

    魔兽世界7.3.5戒律牧怎么堆属性 作为支援职业,戒律牧在团队中主要负责治疗和保持队伍稳定。在选择属性时,需要平衡提高治疗量、减少受到伤害以及提高生存能力等方面。以下是戒律牧配装属性优先级攻略: 最优属性 主属性 智力是最重要的属性,它不仅能提高治疗强度,还能扩大魔法值池。因此,我们要尽可能堆叠合适的智力。 次要属性 戒律牧的次要属性包括: 精神和急速 临时…

    other 2023年6月27日
    00
  • driverbooster更新失败

    以下是“Driver Booster更新失败”的完整攻略: Driver Booster更新失败 Driver Booster是一款常用的驱动更新工具,但有时候更新会失败。本攻略将介绍如何解决Driver更新失败的问题,并提供两个示例。 步骤1:检查网络连接 在更新Driver Booster之前,您需要确保您的计算已连接到互联网。请检查您的网络连接是否正常…

    other 2023年5月7日
    00
  • 图片懒加载imgLazyLoading.js使用详解

    图片懒加载imgLazyLoading.js使用详解 什么是图片懒加载? 图片懒加载是指在页面滚动的时候,只加载可视区域内的图片,而不去加载整个页面中的图片,从而提高网页的加载速度和性能。 imgLazyLoading.js的使用方法 引入imgLazyLoading.js文件 将imgLazyLoading.js文件下载并放置于项目中,然后在页面中引入该文…

    other 2023年6月25日
    00
  • 图文详解C语言位运算基础知识

    图文详解C语言位运算基础知识 本文讲解C语言中的位运算基础知识,包括位运算符的种类、位运算符的作用以及位运算在实际应用中的应用。 位运算符介绍 C语言中有六个位运算符,分别是左移(<<)、右移(>>)、按位与(&)、按位或(|)、按位异或(^)和按位取反(~)。 左移(<<) 左移运算符将指定的位数向左移动,右侧用…

    other 2023年6月27日
    00
  • laravel:419|如何解决pageexpired错误

    在Laravel中,当用户在长时间未操作后,再次提交表单时,可能会出现419 Page Expired错误。这是因为Laravel的CSRF保护机制导的。文将详细介绍如何解决419 Page Expired错误,包括如何禁用RF保护、如何在表单中CSRF令牌等。 禁CSRF保护 禁用CSRF保护是一种解决419 Page Expired错误的方法,但是这样做…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部