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

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

相关文章

  • 代理服务器CCProxy安装与图文设置方法

    下面是“代理服务器CCProxy安装与图文设置方法”的详细攻略。 安装 首先,你需要下载CCProxy的安装文件,可以从官网(http://www.youngzsoft.net/ccproxy/)下载。下载完成后,双击安装文件,按照提示进行安装,安装完成后,启动CCProxy。 配置 CCProxy 配置代理服务器 打开CCProxy,单击“选项”按钮,选择…

    other 2023年6月27日
    00
  • 聊一聊redis奇葩数据类型与集群知识

    聊一聊redis奇葩数据类型与集群知识 奇葩数据类型 HyperLogLog HyperLogLog是一种基数算法,可以用于大规模数据的去重。它可以统计一个数据集合里不重复元素的个数,在空间复杂度和计算复杂度上都比传统的集合去重算法更优秀。 HyperLogLog的原理是通过哈希函数将元素映射到不同的桶里,并记录每个桶内最大的hash值(即桶内的最大值),再…

    other 2023年6月27日
    00
  • JS中页面列表加载的常用方法总结

    JS中页面列表加载的常用方法总结 在Web开发的过程中,我们经常需要使用JavaScript来处理页面上的列表数据展示。这篇文章将总结一些常用的方法,帮助你完成列表的加载和处理。本文涵盖以下方面: 利用原生JS加载列表 使用jQuery库进行列表加载 利用Vue.js框架来完成列表渲染 利用原生JS加载列表 我们可以利用原生JS来加载列表,具体实现思路如下:…

    other 2023年6月25日
    00
  • GPSCheat插件可以轻松自定义/更改手机GPS位置

    首先,让我给出这篇攻略的目录和大致流程: 目录 插件介绍 准备工作 安装GPSCheat插件 自定义/更改手机GPS位置 示例说明 结语 流程 下载并安装工具 打开GPSCheat插件 自定义/更改手机GPS位置 查看应用程序是否使用了新的位置信息 示例说明 下面,我将详细讲解每个步骤。 1. 插件介绍 GPSCheat插件是一款可以轻松自定义/更改手机GP…

    other 2023年6月25日
    00
  • 设置个性qq邮箱格式账号的方法以手机号邮箱账号为例

    设置个性QQ邮箱格式账号的方法以手机号码的邮箱账号为例,其具体操作步骤如下: 打开QQ邮箱网页版,进入登录页面。 在登录框中输入已注册的手机号码邮箱账号和密码,然后登录。 进入QQ邮箱的主界面后,在页面右上角找到“设置”选项,然后点击它。 在设置页面中,找到“账户”选项卡,然后点击它。 在账户选项卡下,找到“账号信息”中的“修改账号”选项,并点击它。 在弹出…

    other 2023年6月27日
    00
  • 下载openvpn

    当然,我很乐意为您提供有关“下载OpenVPN”的完整攻略。以下是详细的步骤和两个示例: 1 下载OpenVPN 要下载OpenVPN,请按照以下步骤进行操作: 1.1 打开OpenVPN官网 在您的Web浏览器中打开OpenVPN官网:https://openvpn.net/community-downloads/ 1.2 选择适合您操作系统的版本 在下载…

    other 2023年5月6日
    00
  • 电脑鼠标右键点击图标闪退桌面重启该怎么办?

    针对“电脑鼠标右键点击图标闪退桌面重启该怎么办?”这个问题,我可以提供以下完整攻略: 第一步:排查是否是软件冲突引起的问题 打开任务管理器,查看是否有正在运行的和占用系统资源较高的软件。 备份电脑中重要数据并卸载可能与出现问题的程序有关的软件。例如,最近刚安装的软件或者最近更新的软件。如果卸载软件后问题解决,则该软件与问题有关。 第二步:尝试修复系统文件 打…

    other 2023年6月27日
    00
  • ASP.NET 应用程序级 验证用户是否登录 一般处理程序

    ASP.NET提供了多种方式来验证用户是否登录,其中应用程序级别的验证是通过在Global.asax中的Session_Start事件处理程序来实现的。下面是一般处理程序实现应用程序级别验证的具体步骤: 打开Visual Studio创建一个新的Web应用程序 添加一个一般处理程序(.ashx文件),命名为CustomHandler。此处理程序将提供验证用户…

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