C语言基于单链表实现通讯录功能

下面是C语言基于单链表实现通讯录功能的完整攻略。

一、需求分析

通讯录功能要求包括以下内容:

  1. 添加联系人;
  2. 删除联系人;
  3. 查找联系人;
  4. 查看联系人列表;
  5. 修改联系人信息。

为了实现这个功能,我们可以使用单链表来存储联系人的数据,并且定义结构体来表示每个联系人的信息,结构体至少包括姓名和电话两个属性。

二、设计算法

  1. 初始化链表:创建一个头节点,并将头指针指向该节点;
  2. 添加联系人:在尾节点后插入一个新节点;
  3. 删除联系人:根据用户输入的联系人名称在链表中查找节点,并将该节点从链表中删除;
  4. 查找联系人:根据用户输入的联系人名称在链表中查找节点,并返回该节点信息;
  5. 查看联系人列表:将链表中所有联系人信息依次输出;
  6. 修改联系人信息:根据用户输入的联系人名称在链表中查找节点,并修改该节点信息。

三、具体实现

下面我们来具体实现上面的算法。

首先,定义一个结构体来保存联系人信息:

typedef struct _Contact {
    char name[20];  // 姓名
    char phone[20]; // 电话
    struct _Contact *next; // 指向下一个节点的指针
} Contact;

接下来,定义链表添加节点和删除节点的函数:

// 添加联系人到链表尾部
void add_contact(Contact **head, Contact *new_contact) {
    Contact *p = *head;
    while (p->next) {
        p = p->next;
    }
    p->next = new_contact;
}

// 删除指定联系人
void delete_contact(Contact **head, char *name) {
    Contact *p1 = *head;
    Contact *p2 = p1->next;
    while (p2 && strcmp(p2->name, name) != 0) {
        p1 = p1->next;
        p2 = p2->next;
    }
    if (!p2) {
        printf("联系人不存在\n");
        return;
    }
    p1->next = p2->next;
    free(p2);
}

然后,定义显示链表中所有联系人的函数:

// 显示所有联系人
void show_contacts(Contact *head) {
    Contact *p = head->next;
    while (p) {
        printf("姓名:%s  电话:%s\n", p->name, p->phone);
        p = p->next;
    }
}

接下来,我们来实现交互式控制台界面,让用户可以方便地使用通讯录功能:

int main() {
    Contact *head = (Contact *)malloc(sizeof(Contact));
    head->next = NULL;

    while (true) {
        printf("请选择您要进行的操作:\n");
        printf("1. 添加联系人\n");
        printf("2. 删除联系人\n");
        printf("3. 查找联系人\n");
        printf("4. 查看联系人列表\n");
        printf("5. 修改联系人信息\n");
        printf("6. 退出程序\n");

        int choice;
        scanf("%d", &choice);
        if (choice == 1) {
            printf("请输入联系人姓名和电话,用空格隔开:\n");
            Contact *new_contact = (Contact *)malloc(sizeof(Contact));
            scanf("%s %s", new_contact->name, new_contact->phone);
            new_contact->next = NULL;
            add_contact(&head, new_contact);
            printf("联系人添加成功!\n");
        } else if (choice == 2) {
            printf("请输入要删除的联系人姓名:\n");
            char name[20];
            scanf("%s", name);
            delete_contact(&head, name);
            printf("联系人删除成功!\n");
        } else if (choice == 3) {
            printf("请输入要查找的联系人姓名:\n");
            char name[20];
            scanf("%s", name);
            Contact *p = head->next;
            while (p && strcmp(p->name, name) != 0) {
                p = p->next;
            }
            if (!p) {
                printf("联系人不存在\n");
            } else {
                printf("姓名:%s  电话:%s\n", p->name, p->phone);
            }
        } else if (choice == 4) {
            show_contacts(head);
        } else if (choice == 5) {
            printf("请输入要修改的联系人姓名:\n");
            char name[20];
            scanf("%s", name);
            Contact *p = head->next;
            while (p && strcmp(p->name, name) != 0) {
                p = p->next;
            }
            if (!p) {
                printf("联系人不存在\n");
            } else {
                printf("请输入联系人的新电话:\n");
                scanf("%s", p->phone);
                printf("联系人信息修改成功!\n");
            }
        } else if (choice == 6) {
            break;
        } else {
            printf("无效的选项,请重新选择!\n");
        }
    }

    return 0;
}

四、示例说明

我们来看两个使用示例。

示例一:添加联系人

用户选择1,然后输入联系人姓名和电话:

请选择您要进行的操作:
1. 添加联系人
2. 删除联系人
3. 查找联系人
4. 查看联系人列表
5. 修改联系人信息
6. 退出程序
1
请输入联系人姓名和电话,用空格隔开:
Alice 13312345678
联系人添加成功!

下面执行查看联系人列表操作,可以看到已经添加的联系人信息:

请选择您要进行的操作:
1. 添加联系人
2. 删除联系人
3. 查找联系人
4. 查看联系人列表
5. 修改联系人信息
6. 退出程序
4
姓名:Alice  电话:13312345678

示例二:删除联系人

用户选择2,然后输入要删除的联系人姓名:

请选择您要进行的操作:
1. 添加联系人
2. 删除联系人
3. 查找联系人
4. 查看联系人列表
5. 修改联系人信息
6. 退出程序
2
请输入要删除的联系人姓名:
Alice
联系人删除成功!

下面再次执行查看联系人列表操作,可以看到该联系人已经被删除:

请选择您要进行的操作:
1. 添加联系人
2. 删除联系人
3. 查找联系人
4. 查看联系人列表
5. 修改联系人信息
6. 退出程序
4

输出结果为空,说明联系人已经被删除了。

五、总结

这里我们简单说明了如何基于单链表实现通讯录功能。通过对链表的添加、删除、查找等操作,结合交互式控制台界面,我们能够实现一个功能简单但实用的通讯录应用程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言基于单链表实现通讯录功能 - Python技术站

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

相关文章

  • 深入理解JVM自动内存管理

    深入理解JVM自动内存管理攻略 1. JVM内存模型 JVM内存模型由以下几个部分组成: 程序计数器(Program Counter):用于指示当前线程执行的字节码指令的地址。 Java虚拟机栈(Java Virtual Machine Stack):每个线程在运行时都会创建一个栈,用于存储局部变量、方法参数、返回值等。栈帧包含了方法的运行时数据。 本地方法…

    other 2023年8月1日
    00
  • vue 路由嵌套高亮问题的解决方法

    Vue 路由嵌套高亮问题的解决方法攻略 在 Vue 中,当使用路由嵌套时,我们可能会遇到一个常见的问题:如何在嵌套路由中正确地高亮当前活动的链接。本攻略将详细介绍解决这个问题的方法,并提供两个示例说明。 方法一:使用动态类绑定 Vue 提供了一种简单的方法来解决路由嵌套高亮问题,即使用动态类绑定。我们可以通过在路由链接上绑定一个动态类,根据当前路由的路径来判…

    other 2023年7月28日
    00
  • Flutter实现下拉刷新和上拉加载更多

    下面是针对“Flutter实现下拉刷新和上拉加载更多”的完整攻略: Flutter实现下拉刷新和上拉加载更多 1. 简介 下拉刷新和上拉加载更多是移动端APP开发中常用的功能,它们可以提高用户体验和应用的交互性。Flutter框架提供了很多开箱即用的控件来帮助我们实现这些功能。本篇文章将介绍如何使用Flutter框架实现下拉刷新和上拉加载更多。 2. 下拉刷…

    other 2023年6月25日
    00
  • 红色至日游戏打不开怎么办 红色至日进不去游戏的解决方法

    红色至日游戏打不开的解决方法 如果在游戏过程中遇到“红色至日游戏打不开”的问题,有以下几个方法可以尝试解决: 1. 检查网络连接 首先要确保网络连接正常,如果网络连接不稳定或者中断,就会出现“红色至日游戏打不开”的情况。可以尝试重新连接网络或者检查网络设置。 2. 清除缓存 游戏中的缓存文件有时会对游戏进程产生影响,因此建议清除缓存文件。具体操作如下: 打开…

    other 2023年6月27日
    00
  • pandas修改列名

    pandas修改列名 Pandas是Python中最常用的数据分析库之一,它提供了大量的函数和工具,使得数据处理、分析和可视化变得更加容易。Pandas中的数据结构主要有Series和DataFrame,而列名是DataFrame中最重要的属性之一。在这篇文章中,我们将更加详细地介绍如何使用Pandas修改DataFrame中的列名。 什么是列名 在Data…

    其他 2023年3月28日
    00
  • 苹果手机无法更新系统怎么办 iphone更新系统失败的解决办法

    苹果手机无法更新系统是一个常见的问题,主要有以下几种情况: 1.空间不足:更新系统需要足够的储存空间,如果手机储存空间不足,则会提示无法更新。 2.网络问题:更新系统需要连接良好的网络,如果网络不稳定或者网速过慢,更新过程可能会失败。 3.设备被强制关机:设备在更新过程中出现异常关机或者中途断电等情况,会导致更新失败。 如果遇到以上情况,可以尝试以下几个解决…

    other 2023年6月27日
    00
  • Android中实现淘宝购物车RecyclerView或LIstView的嵌套选择的逻辑

    Android中实现淘宝购物车RecyclerView或ListView的嵌套选择的逻辑攻略 在Android中实现淘宝购物车中的嵌套选择逻辑,可以通过以下步骤来完成: 步骤一:准备数据模型 首先,我们需要准备一个数据模型来表示购物车中的商品信息。可以创建一个CartItem类,包含商品的名称、价格、数量等属性。 public class CartItem …

    other 2023年7月28日
    00
  • 网管和黑客都必须知道的命令

    网管和黑客都必须知道的命令 简介 作为一名网管或黑客,熟练掌握命令行常用命令是必不可少的基本素质。本文将介绍一些常用的命令,这些命令在网络维护和安全检测中非常实用。 常用命令 1. nmap nmap是一个开源的网络探测工具,可以检测主机、端口和服务等信息。使用nmap命令可以进行二层和三层扫描,并制定不同的扫描方式,如TCP、UDP和ICMP等协议。 示例…

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