C语言实现简易通讯录:动态链表与数据管理的编程实践

 

引言

在数字化时代,通讯录作为管理联系人信息的重要工具,承载着存储和快速检索联系人数据的功能。使用C语言开发简易通讯录,能够将动态内存分配、链表数据结构与文件操作等核心知识相结合,实现联系人信息的高效管理。通过该项目实践,不仅有助于掌握C语言中指针、结构体的复杂应用,还能培养解决实际数据管理问题的编程能力。本文将详细介绍如何利用C语言构建一个具备添加、查询、修改、删除功能的简易通讯录,并解析其核心代码逻辑。

一、系统功能需求分析

一个基础的简易通讯录应具备以下核心功能:

1. 联系人信息录入:能够录入联系人的基本信息,包括姓名、电话号码、电子邮箱等。

2. 信息查询:支持按姓名或电话号码快速查询联系人信息。

3. 信息修改:允许对已录入的联系人信息进行修改。

4. 信息删除:可删除不再需要的联系人记录。

5. 数据持久化:将联系人信息保存到文件中,下次启动程序时能够读取数据继续操作 。

二、C语言实现简易通讯录核心代码

2.1 定义数据结构
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义联系人结构体
typedef struct Contact {
    char name[50];
    char phone[20];
    char email[100];
    struct Contact *next;
} Contact;

Contact *head = NULL;
代码解析

使用typedef定义Contact结构体,包含姓名(name)、电话号码(phone)、电子邮箱(email)以及指向下一个节点的指针(next)。head指针指向链表的头节点,初始化为NULL,表示空链表。

2.2 动态链表创建与节点添加功能
// 创建新的联系人节点
Contact* createContactNode() {
    Contact *newNode = (Contact *)malloc(sizeof(Contact));
    if (newNode == NULL) {
        printf("内存分配失败!\n");
        return NULL;
    }
    printf("请输入联系人姓名: ");
    scanf("%s", newNode->name);
    printf("请输入联系人电话号码: ");
    scanf("%s", newNode->phone);
    printf("请输入联系人电子邮箱: ");
    scanf("%s", newNode->email);
    newNode->next = NULL;
    return newNode;
}

// 添加联系人
void addContact() {
    Contact *newNode = createContactNode();
    if (newNode == NULL) {
        return;
    }
    if (head == NULL) {
        head = newNode;
    } else {
        Contact *temp = head;
        while (temp->next!= NULL) {
            temp = temp->next;
        }
        temp->next = newNode;
    }
    printf("联系人添加成功!\n");
}
代码解析

createContactNode函数负责创建新的联系人节点。通过malloc函数动态分配内存,获取用户输入的姓名、电话号码和电子邮箱后,将节点的next指针设为NULL,最后返回新节点。addContact函数调用createContactNode创建新节点,若链表为空,则将新节点设为头节点;若链表不为空,遍历到链表尾部,将新节点添加到链表末尾。

2.3 联系人信息查询功能
// 按姓名查询联系人
void searchContactByName() {
    char searchName[50];
    printf("请输入要查询的联系人姓名: ");
    scanf("%s", searchName);
    Contact *temp = head;
    while (temp!= NULL) {
        if (strcmp(temp->name, searchName) == 0) {
            printf("姓名: %s,电话: %s,邮箱: %s\n", temp->name, temp->phone, temp->email);
            return;
        }
        temp = temp->next;
    }
    printf("未找到该联系人!\n");
}

// 按电话号码查询联系人
void searchContactByPhone() {
    char searchPhone[20];
    printf("请输入要查询的电话号码: ");
    scanf("%s", searchPhone);
    Contact *temp = head;
    while (temp!= NULL) {
        if (strcmp(temp->phone, searchPhone) == 0) {
            printf("姓名: %s,电话: %s,邮箱: %s\n", temp->name, temp->phone, temp->email);
            return;
        }
        temp = temp->next;
    }
    printf("未找到该联系人!\n");
}
代码解析

searchContactByName函数实现按姓名查询联系人。获取用户输入的姓名后,遍历链表,使用strcmp函数比较姓名,若找到匹配的节点则输出联系人信息;若遍历完链表未找到,则提示未找到。searchContactByPhone函数原理类似,按电话号码进行查询。

2.4 联系人信息修改功能
// 修改联系人信息
void modifyContact() {
    char searchName[50];
    printf("请输入要修改的联系人姓名: ");
    scanf("%s", searchName);
    Contact *temp = head;
    while (temp!= NULL) {
        if (strcmp(temp->name, searchName) == 0) {
            printf("请输入新的电话号码: ");
            scanf("%s", temp->phone);
            printf("请输入新的电子邮箱: ");
            scanf("%s", temp->email);
            printf("联系人信息修改成功!\n");
            return;
        }
        temp = temp->next;
    }
    printf("未找到该联系人!\n");
}
代码解析

modifyContact函数先获取要修改信息的联系人姓名,遍历链表找到对应节点后,获取...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值