引言
在数字化时代,通讯录作为管理联系人信息的重要工具,承载着存储和快速检索联系人数据的功能。使用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函数先获取要修改信息的联系人姓名,遍历链表找到对应节点后,获取...