C语言单链表实现通讯录管理系统

C语言单链表实现通讯录管理系统

本文介绍如何使用C语言的单链表数据结构来实现通讯录管理系统。

数据结构设计

首先,我们需要设计出通讯录中需要保存的数据类型及其结构。在本教程中,我们仅考虑每个联系人需要保存姓名和电话。

struct Contact {
    char name[20];
    char phone[20];
    struct Contact* next;
};

以上代码定义了一个 Contact 结构体,它包含了保存姓名和电话信息的两个字符数组,以及一个指向下一个联系人的指针。

功能实现

添加联系人

当用户需要添加一个新的联系人时,我们需要通过单链表数据结构将新的联系人添加到通讯录中。具体实现如下:

void add_contact(struct Contact** head, char name[], char phone[]) {
    struct Contact* new_contact = (struct Contact*)malloc(sizeof(struct Contact));
    strcpy(new_contact->name, name);
    strcpy(new_contact->phone, phone);
    new_contact->next = NULL;

    if (*head == NULL) {
        *head = new_contact;
    }
    else {
        struct Contact* curr = *head;
        while (curr->next != NULL) {
            curr = curr->next;
        }
        curr->next = new_contact;
    }
}

以上代码实现了添加联系人的功能,其中:

  • head 是指向单链表头节点的指针;
  • namephone 分别是新的联系人的姓名和电话号码。

删除联系人

当用户需要删除一个已有的联系人时,我们需要通过单链表数据结构找到该联系人并将其从通讯录中删除。具体实现如下:

void delete_contact(struct Contact** head, char name[]) {
    if (*head == NULL) {
        printf("Contact list is empty.\n");
        return;
    }

    struct Contact* curr = *head;
    if (strcmp(curr->name, name) == 0) {
        *head = curr->next;
        free(curr);
    }
    else {
        struct Contact* prev = curr;
        curr = curr->next;
        while (curr != NULL && strcmp(curr->name, name) != 0) {
            prev = curr;
            curr = curr->next;
        }
        if (curr == NULL) {
            printf("Contact not found.\n");
        }
        else {
            prev->next = curr->next;
            free(curr);
        }
    }
}

以上代码实现了删除联系人的功能,其中:

  • head 是指向单链表头节点的指针;
  • name 是待删除联系人的姓名。

修改联系人

当用户需要修改一个已有的联系人的电话号码时,我们需要通过单链表数据结构找到该联系人并修改其电话号码。具体实现如下:

void modify_contact(struct Contact** head, char name[], char phone[]) {
    struct Contact* curr = *head;
    while (curr != NULL && strcmp(curr->name, name) != 0) {
        curr = curr->next;
    }
    if (curr == NULL) {
        printf("Contact not found.\n");
    }
    else {
        strcpy(curr->phone, phone);
    }
}

以上代码实现了修改联系人的功能,其中:

  • head 是指向单链表头节点的指针;
  • name 是待修改联系人的姓名;
  • phone 是待修改后的电话号码。

示例

示例1 添加联系人

int main() {
    struct Contact* head = NULL;

    add_contact(&head, "Bob", "123456");
    add_contact(&head, "Alice", "654321");

    return 0;
}

以上代码示例创建了一个新的通讯录,并向其中添加了两个联系人。

示例2 删除联系人

int main() {
    struct Contact* head = NULL;

    add_contact(&head, "Bob", "123456");
    add_contact(&head, "Alice", "654321");

    delete_contact(&head, "Alice");

    return 0;
}

以上代码示例创建了一个新的通讯录,并向其中添加了两个联系人,然后删除了其中一个联系人。

总结

本教程介绍了如何使用C语言的单链表数据结构来实现通讯录管理系统。我们实现了向通讯录中添加联系人、删除联系人和修改联系人信息的功能,并为每个联系人定义了一个自定义的数据类型。这些功能的实现过程中用到了指针、动态内存分配和字符串处理等基本知识。

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

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 如何在C++中调用python代码你知道吗

    当我们需要在 C++ 项目中调用 Python 代码时,可以通过内置的 Python 解释器来实现。以下是在 C++ 中使用 Python 的完整攻略: 步骤一:安装Python解释器 首先需要安装 Python 解释器。我们可以从官网下载并安装最新版本的 Python,也可以使用 Anaconda 等发行版。安装完成之后,需要将 Python 的路径添加到…

    C 2023年5月23日
    00
  • C++如何实现定长内存池详解

    C++实现定长内存池的详细攻略如下: 什么是定长内存池 定长内存池是一种用于管理内存分配和释放的方法。相对于动态内存分配和释放,定长内存池可以更高效地管理内存,因为它不需要频繁地进行内存分配和释放操作,而是预先分配一块连续的内存空间,然后在此基础上进行内存管理。 定长内存池的实现方法 在C++中,我们可以使用标准库中的std::vector或者自己实现一个内…

    C 2023年5月23日
    00
  • Win11无法找到脚本文件c:users\administrator怎么办?

    针对“Win11无法找到脚本文件c:users\administrator怎么办?”这个问题,一般会出现在Win11系统中启动或者运行特定应用程序时,提示找不到指定路径的脚本文件。解决这个问题需要进行以下步骤: 检查文件路径是否正确:在命令提示符或者Powershell中输入dir命令检查目标路径下是否存在对应的文件。如果不存在,则需要重新定位目标路径,或者…

    C 2023年5月23日
    00
  • Python实现将字典内容写入json文件

    Python是一种非常强大的编程语言,也是一种非常受欢迎的数据处理工具。Python也是解析JSON格式数据的一种非常常用的方式。下面是“Python实现将字典内容写入JSON文件”的完整攻略: 第一步:导入json模块 Python支持读写JSON格式的数据,需要先导入json模块。在Python标准库中,json模块提供了两个方法load()和dump(…

    C 2023年5月23日
    00
  • C语言代码实现简单三子棋游戏

    C语言代码实现简单三子棋游戏 简介 三子棋是一种经典的策略游戏,在游戏中两位玩家轮流放置棋子,直到有一方在棋盘上形成连续的三枚棋子为止。由于其简单而有趣,常被用于讲解人工智能、算法等知识点。本文将介绍如何使用C语言编写一个简单的三子棋游戏。 准备工作 在开始编码前,需要先准备好C语言的开发环境。推荐使用Visual Studio Code和MinGW来进行开…

    C 2023年5月23日
    00
  • 深入解析C++11 lambda表达式/包装器/线程库

    深入解析C++11 lambda表达式/包装器/线程库 C++11 lambda表达式 Lambda表达式是C++11中最重要的新特性之一。Lambda表达式提供了一种简单且易于使用的方式,用于定义和传递匿名的、可调用的代码块。 基本语法 Lambda表达式的基本语法如下: [capture list] (params) -> return_type …

    C 2023年5月22日
    00
  • C语言模拟实现strstr函数的示例代码

    C语言中的strstr函数是用来查找一个字符串中是否包含另一个字符串的函数,其原型定义如下: char *strstr(const char *haystack, const char *needle); 其中,haystack表示要查找的字符串,needle表示要搜索的子字符串。该函数返回子字符串在要查找的字符串中第一次出现的位置的指针,如果没有找到,则返…

    C 2023年5月24日
    00
  • c++如何控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

    控制C++对象的创建方式和数量,一般可以通过两种方式实现:禁止对象的栈和堆上的创建,以及限制对象数量。下面将分别对这两种方法进行介绍,并提供示例说明。 1. 禁止对象在栈和堆上创建 为了禁止对象在栈和堆上创建,一种方法是将C++对象的构造函数设置为私有,以确保对象只能在类内部创建。为了让外部访问该类的对象,可以使用静态方法作为工厂函数,该函数在内部创建类的对…

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