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日

相关文章

  • Android 访问文件权限的四种模式介绍

    Android 访问文件权限的四种模式介绍 在Android开发中,访问文件权限是一个重要的话题。Android提供了四种不同的文件访问权限模式,分别是: 私有模式(Private Mode):在私有模式下,应用程序可以创建和访问其私有目录中的文件。其他应用程序无法直接访问这些文件。这种模式适用于应用程序需要保存用户数据或配置信息的情况。以下是一个示例: F…

    other 2023年9月6日
    00
  • 详解Android的四大应用程序组件

    让我来为大家详细讲解“详解Android的四大应用程序组件”的攻略。 什么是四大应用程序组件 Android的四大应用程序组件包括: Activity(活动) Service(服务) ContentProvider(内容提供者) BroadcastReceiver(广播接收器) 这些组件结合起来,可以实现一个完整的Android应用。 Activity(活动…

    other 2023年6月25日
    00
  • mysql去重查询的三种方法小结

    MySQL去重查询的三种方法小结 在MySQL中,我们经常需要进行去重查询,以获取唯一的结果集。以下是三种常用的去重查询方法的详细讲解: 方法一:使用DISTINCT关键字 使用DISTINCT关键字可以从查询结果中去除重复的行。 示例说明1:查询表中不重复的城市列表 SELECT DISTINCT city FROM customers; 方法二:使用GR…

    other 2023年10月18日
    00
  • Win11系统右键怎么新建txt文件?Win11系统新建txt文件方法

    Win11系统新增txt文件的方法非常简单,下面我将给出具体的攻略步骤,包括了两个示例说明。 方案一:使用鼠标右键操作 在桌面或者任意文件夹空白处单击鼠标右键,弹出快捷菜单。 在菜单中选择“新建” -> “文本文档”。 Windows会自动为文本文档命名为“新建文本文档.txt”,你可以通过重命名来修改其名称。 示例说明一:假设你需要在桌面新建一个名为…

    other 2023年6月27日
    00
  • SpringBoot前端后端分离之Nginx服务器下载安装过程

    下面是“SpringBoot前端后端分离之Nginx服务器下载安装过程”的完整攻略: SpringBoot前端后端分离之Nginx服务器下载安装过程 1. 下载Nginx 在Nginx的官方网站上(http://nginx.org),选择下载最新版本的Nginx压缩包,解压到指定目录,例如:/usr/local/src/nginx。 $ wget http:…

    other 2023年6月27日
    00
  • vue-element-admin关闭eslint的校验方式

    要关闭 eslint 的校验,可以通过以下几个步骤实现: 步骤一:打开项目根目录下的 .eslintrc.js 配置文件 这个文件就是 eslint 的配置文件,用于指定检查的规则和配置项。打开这个文件,找到下面这一行代码: "extends": ["plugin:vue/essential", "eslin…

    other 2023年6月27日
    00
  • winform分页控件 附源码下载

    Winform分页控件攻略 什么是Winform分页控件 Winform分页控件是一种用来在Windows桌面应用程序中实现数据分页显示的控件,它可以实现数据的分页查询、快速定位和显示,是非常实用的控件之一。 如何使用Winform分页控件 1. 控件的引入 您可以下载自己喜欢的Winform分页控件控件,或自行编写相应的控件。后文以“PagerContro…

    other 2023年6月27日
    00
  • Lua中字符串(string)浅析

    Lua中字符串(string)浅析 在Lua中,字符串(string)是一种基本数据类型,用于表示和处理文本数据。本文将对Lua中字符串的定义、常见操作、转义字符、长字符串等内容进行分析并结合示例进行说明。 字符串的定义 在Lua中,字符串字面量可以用引号(单引号或双引号)来表示,例如: local str1 = "hello, world&quo…

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