您好,登录后才能下订单哦!
通讯录是我们日常生活中常用的工具之一,它可以帮助我们存储和管理联系人信息。在本文中,我们将使用C语言来实现一个简单的通讯录功能。通过这个项目,你将学习如何使用C语言进行文件操作、数据结构设计以及模块化编程。
在开始编写代码之前,我们需要明确通讯录的基本功能需求:
为了实现上述功能,我们需要设计一个合适的数据结构来存储联系人信息。我们可以使用结构体来表示每个联系人,并使用链表或数组来存储多个联系人。
typedef struct Contact {
char name[50];
char phone[15];
char email[50];
struct Contact* next;
} Contact;
在这个结构体中,name
、phone
和email
分别表示联系人的姓名、电话号码和电子邮件地址。next
指针用于将多个联系人连接成一个链表。
typedef struct AddressBook {
Contact* head;
int count;
} AddressBook;
AddressBook
结构体包含一个指向链表头部的指针head
和一个表示联系人总数的整数count
。
接下来,我们将通讯录的功能划分为多个模块,每个模块负责实现一个特定的功能。
首先,我们定义联系人和通讯录的结构体。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Contact {
char name[50];
char phone[15];
char email[50];
struct Contact* next;
} Contact;
typedef struct AddressBook {
Contact* head;
int count;
} AddressBook;
接下来,我们实现添加联系人的功能。用户输入联系人的姓名、电话号码和电子邮件地址,程序将其添加到通讯录中。
void addContact(AddressBook* book) {
Contact* newContact = (Contact*)malloc(sizeof(Contact));
if (newContact == NULL) {
printf("内存分配失败!\n");
return;
}
printf("请输入姓名: ");
scanf("%s", newContact->name);
printf("请输入电话号码: ");
scanf("%s", newContact->phone);
printf("请输入电子邮件: ");
scanf("%s", newContact->email);
newContact->next = book->head;
book->head = newContact;
book->count++;
printf("联系人添加成功!\n");
}
删除联系人的功能需要用户输入要删除的联系人姓名,程序遍历链表找到该联系人并将其删除。
void deleteContact(AddressBook* book, char* name) {
Contact* current = book->head;
Contact* previous = NULL;
while (current != NULL) {
if (strcmp(current->name, name) == 0) {
if (previous == NULL) {
book->head = current->next;
} else {
previous->next = current->next;
}
free(current);
book->count--;
printf("联系人删除成功!\n");
return;
}
previous = current;
current = current->next;
}
printf("未找到该联系人!\n");
}
查找联系人的功能允许用户通过姓名查找联系人信息。
void findContact(AddressBook* book, char* name) {
Contact* current = book->head;
while (current != NULL) {
if (strcmp(current->name, name) == 0) {
printf("姓名: %s\n", current->name);
printf("电话号码: %s\n", current->phone);
printf("电子邮件: %s\n", current->email);
return;
}
current = current->next;
}
printf("未找到该联系人!\n");
}
修改联系人的功能允许用户通过姓名查找联系人并修改其信息。
void modifyContact(AddressBook* book, char* name) {
Contact* current = book->head;
while (current != NULL) {
if (strcmp(current->name, name) == 0) {
printf("请输入新的电话号码: ");
scanf("%s", current->phone);
printf("请输入新的电子邮件: ");
scanf("%s", current->email);
printf("联系人信息修改成功!\n");
return;
}
current = current->next;
}
printf("未找到该联系人!\n");
}
显示所有联系人的功能将遍历链表并打印每个联系人的信息。
void displayContacts(AddressBook* book) {
Contact* current = book->head;
if (current == NULL) {
printf("通讯录为空!\n");
return;
}
while (current != NULL) {
printf("姓名: %s\n", current->name);
printf("电话号码: %s\n", current->phone);
printf("电子邮件: %s\n", current->email);
printf("----------------------------\n");
current = current->next;
}
}
保存通讯录到文件的功能将通讯录中的联系人信息写入到一个文件中。
void saveToFile(AddressBook* book, char* filename) {
FILE* file = fopen(filename, "w");
if (file == NULL) {
printf("文件打开失败!\n");
return;
}
Contact* current = book->head;
while (current != NULL) {
fprintf(file, "%s,%s,%s\n", current->name, current->phone, current->email);
current = current->next;
}
fclose(file);
printf("通讯录已保存到文件!\n");
}
从文件加载通讯录的功能将从文件中读取联系人信息并重新构建通讯录。
void loadFromFile(AddressBook* book, char* filename) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
printf("文件打开失败!\n");
return;
}
char name[50], phone[15], email[50];
while (fscanf(file, "%[^,],%[^,],%[^\n]\n", name, phone, email) != EOF) {
Contact* newContact = (Contact*)malloc(sizeof(Contact));
if (newContact == NULL) {
printf("内存分配失败!\n");
return;
}
strcpy(newContact->name, name);
strcpy(newContact->phone, phone);
strcpy(newContact->email, email);
newContact->next = book->head;
book->head = newContact;
book->count++;
}
fclose(file);
printf("通讯录已从文件加载!\n");
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Contact {
char name[50];
char phone[15];
char email[50];
struct Contact* next;
} Contact;
typedef struct AddressBook {
Contact* head;
int count;
} AddressBook;
void addContact(AddressBook* book) {
Contact* newContact = (Contact*)malloc(sizeof(Contact));
if (newContact == NULL) {
printf("内存分配失败!\n");
return;
}
printf("请输入姓名: ");
scanf("%s", newContact->name);
printf("请输入电话号码: ");
scanf("%s", newContact->phone);
printf("请输入电子邮件: ");
scanf("%s", newContact->email);
newContact->next = book->head;
book->head = newContact;
book->count++;
printf("联系人添加成功!\n");
}
void deleteContact(AddressBook* book, char* name) {
Contact* current = book->head;
Contact* previous = NULL;
while (current != NULL) {
if (strcmp(current->name, name) == 0) {
if (previous == NULL) {
book->head = current->next;
} else {
previous->next = current->next;
}
free(current);
book->count--;
printf("联系人删除成功!\n");
return;
}
previous = current;
current = current->next;
}
printf("未找到该联系人!\n");
}
void findContact(AddressBook* book, char* name) {
Contact* current = book->head;
while (current != NULL) {
if (strcmp(current->name, name) == 0) {
printf("姓名: %s\n", current->name);
printf("电话号码: %s\n", current->phone);
printf("电子邮件: %s\n", current->email);
return;
}
current = current->next;
}
printf("未找到该联系人!\n");
}
void modifyContact(AddressBook* book, char* name) {
Contact* current = book->head;
while (current != NULL) {
if (strcmp(current->name, name) == 0) {
printf("请输入新的电话号码: ");
scanf("%s", current->phone);
printf("请输入新的电子邮件: ");
scanf("%s", current->email);
printf("联系人信息修改成功!\n");
return;
}
current = current->next;
}
printf("未找到该联系人!\n");
}
void displayContacts(AddressBook* book) {
Contact* current = book->head;
if (current == NULL) {
printf("通讯录为空!\n");
return;
}
while (current != NULL) {
printf("姓名: %s\n", current->name);
printf("电话号码: %s\n", current->phone);
printf("电子邮件: %s\n", current->email);
printf("----------------------------\n");
current = current->next;
}
}
void saveToFile(AddressBook* book, char* filename) {
FILE* file = fopen(filename, "w");
if (file == NULL) {
printf("文件打开失败!\n");
return;
}
Contact* current = book->head;
while (current != NULL) {
fprintf(file, "%s,%s,%s\n", current->name, current->phone, current->email);
current = current->next;
}
fclose(file);
printf("通讯录已保存到文件!\n");
}
void loadFromFile(AddressBook* book, char* filename) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
printf("文件打开失败!\n");
return;
}
char name[50], phone[15], email[50];
while (fscanf(file, "%[^,],%[^,],%[^\n]\n", name, phone, email) != EOF) {
Contact* newContact = (Contact*)malloc(sizeof(Contact));
if (newContact == NULL) {
printf("内存分配失败!\n");
return;
}
strcpy(newContact->name, name);
strcpy(newContact->phone, phone);
strcpy(newContact->email, email);
newContact->next = book->head;
book->head = newContact;
book->count++;
}
fclose(file);
printf("通讯录已从文件加载!\n");
}
int main() {
AddressBook book = {NULL, 0};
int choice;
char name[50];
char filename[50];
while (1) {
printf("\n通讯录管理系统\n");
printf("1. 添加联系人\n");
printf("2. 删除联系人\n");
printf("3. 查找联系人\n");
printf("4. 修改联系人\n");
printf("5. 显示所有联系人\n");
printf("6. 保存通讯录到文件\n");
printf("7. 从文件加载通讯录\n");
printf("8. 退出\n");
printf("请选择操作: ");
scanf("%d", &choice);
switch (choice) {
case 1:
addContact(&book);
break;
case 2:
printf("请输入要删除的联系人姓名: ");
scanf("%s", name);
deleteContact(&book, name);
break;
case 3:
printf("请输入要查找的联系人姓名: ");
scanf("%s", name);
findContact(&book, name);
break;
case 4:
printf("请输入要修改的联系人姓名: ");
scanf("%s", name);
modifyContact(&book, name);
break;
case 5:
displayContacts(&book);
break;
case 6:
printf("请输入要保存的文件名: ");
scanf("%s", filename);
saveToFile(&book, filename);
break;
case 7:
printf("请输入要加载的文件名: ");
scanf("%s", filename);
loadFromFile(&book, filename);
break;
case 8:
printf("退出程序。\n");
return 0;
default:
printf("无效的选择,请重新输入!\n");
}
}
return 0;
}
通过本文,我们学习了如何使用C语言实现一个简单的通讯录功能。我们设计了合适的数据结构,并实现了添加、删除、查找、修改、显示、保存和加载联系人信息的功能。这个项目不仅帮助我们巩固了C语言的基础知识,还让我们了解了如何进行模块化编程和文件操作。希望这个项目对你有所帮助,并激发你进一步探索C语言的兴趣。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。