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语言的可变参数函数实现详解

    C语言的可变参数函数实现详解 1. 可变参数函数概述 可变参数函数是指可以接收任意数量参数的函数,参数数量及类型可以在调用时动态确定。在C语言中,可变参数函数通过stdargs.h头文件提供的宏来实现。而在C++中,则通过stdarg.h头文件中的相应函数和类型来实现。 2. 可变参数函数声明 可变参数函数在定义时,需要使用省略号(…)来表示可变参数的部…

    C 2023年5月23日
    00
  • 解决@Transactional注解事务不回滚不起作用的问题

    解决@Transactional注解事务不回滚不起作用的问题的详细攻略如下: 问题描述 在进行数据库操作时,我们通常会使用@Transactional注解来保证事务的原子性,但在使用过程中可能会出现事务不回滚不起作用的问题,导致数据一旦出现异常就无法恢复。这种情况通常是因为注解失效或者配置不正确导致的。 解决方案 1. 配置文件中开启事务管理器 我们可以在配…

    C 2023年5月23日
    00
  • c语言的指针数组详解

    c语言的指针数组详解 在C语言中,指针数组是一个非常重要的数据结构。它是由若干个指针组成的数组,每个指针存储了一个地址值,该地址指向一个具体的内存区域。通过指针数组,我们可以非常方便地管理多个指针,同时还可以用于实现动态内存分配和传递多个指针参数等情况。 定义指针数组 指针数组的定义格式为: 数据类型 *数组名称[数组长度]; 其中,数据类型表示指针指向的数…

    C 2023年5月23日
    00
  • C语言实现数独程序的示例代码

    下面是关于“C语言实现数独程序的示例代码”的完整攻略: 一、编写数独程序的流程 1. 确定程序输入和输出 数独程序的输入应该是一个9×9的矩阵,即数独的谜题,其中0表示未知格子。程序的输出应该是一个解开谜题后的9×9矩阵。 2. 确定算法 数独程序的算法一般有两种,分别是暴力求解和回溯法。 2.1 暴力求解 暴力求解是指从左到右、从上到下依次填数,直到填到空…

    C 2023年5月23日
    00
  • c病毒程序原理分析(防范病毒 c语言小病毒示例)

    这篇文章主要是讲解如何防范病毒及 c 语言小病毒示例,文章中包含两条示例说明。 标题 C 病毒程序原理分析 正文 病毒是计算机领域中的一种非常危险的电脑程序,可以通过复制自身的方式感染计算机,破坏计算机系统的正常运行。在这篇文章中,我们将简单介绍 C 病毒程序的原理以及如何防范此类病毒。 防范病毒 升级防病毒软件:使用强大的防病毒软件可以有效的保护计算机系统…

    C 2023年5月23日
    00
  • C语言学好递归看这一篇就够了

    C语言学好递归看这一篇就够了 什么是递归 递归(Recursion)是指在函数定义中使用函数自身的方法,是一种常用的解决问题的方法,通过不断调用自身,将大问题分解为小问题解决,最终达到解决整个问题的目的。 递归的三要素 递归包含三个要素:- 递归出口- 递归调用- 递归返回 递归示例一:求斐波那契数列第n项 斐波那契数列是指每一项都等于它前面两项的和,第一项…

    C 2023年5月22日
    00
  • Go语言对JSON进行编码和解码的方法

    Go语言对JSON进行编码和解码的方法主要通过标准库中的“encoding/json”来实现。下面是完整的攻略: 1. 编码JSON 要将数据编码为JSON格式的字符串,我们可以使用json.Marshal()函数。下面是示例代码: package main import ( "encoding/json" "fmt"…

    C 2023年5月23日
    00
  • QT中如何读写ini配置文件

    QT中可以很方便地读写ini格式的配置文件,下面是读写ini配置文件的完整攻略: 1. 先创建QSettings对象 QSettings对象是QT中读写配置文件的对象,调用它的相关方法可以轻松完成对配置文件的读写操作。需要调用QSettings对象的构造函数来创建对象,构造函数的参数有两个:文件名和格式。 例如,在mainwindow.cpp中创建一个叫做m…

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