使用c语言数据结构写一个通讯录系统,功能包括新建联系人,模糊查找联系人,删除联系人,修改联系人信息,个性化排序,通讯录分组等功能
时间: 2024-03-02 12:50:11 浏览: 107
好的,以下是一个简单的通讯录系统的 C 语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 50
#define MAX_PHONE_LEN 20
#define MAX_EMAIL_LEN 50
#define MAX_CONTACTS 1000
typedef struct {
char name[MAX_NAME_LEN];
char phone[MAX_PHONE_LEN];
char email[MAX_EMAIL_LEN];
} Contact;
Contact contacts[MAX_CONTACTS];
int num_contacts = 0;
int compare_contacts_by_name(const void *a, const void *b) {
return strcmp(((Contact *)a)->name, ((Contact *)b)->name);
}
int compare_contacts_by_phone(const void *a, const void *b) {
return strcmp(((Contact *)a)->phone, ((Contact *)b)->phone);
}
int compare_contacts_by_email(const void *a, const void *b) {
return strcmp(((Contact *)a)->email, ((Contact *)b)->email);
}
int add_contact() {
if (num_contacts >= MAX_CONTACTS) {
printf("通讯录已满,无法添加新联系人!\n");
return 0;
}
Contact new_contact;
printf("请输入联系人姓名:");
scanf("%s", new_contact.name);
printf("请输入联系人电话:");
scanf("%s", new_contact.phone);
printf("请输入联系人电子邮件:");
scanf("%s", new_contact.email);
contacts[num_contacts++] = new_contact;
printf("联系人已添加成功!\n");
return 1;
}
int find_contacts(const char *query, int (*compare_fn)(const void *, const void *)) {
int num_results = 0;
for (int i = 0; i < num_contacts; i++) {
if (strstr(contacts[i].name, query) != NULL ||
strstr(contacts[i].phone, query) != NULL ||
strstr(contacts[i].email, query) != NULL) {
printf("%s\t%s\t%s\n", contacts[i].name, contacts[i].phone, contacts[i].email);
num_results++;
}
}
if (num_results == 0) {
printf("没有找到相关联系人!\n");
}
return num_results;
}
int delete_contacts(const char *query, int (*compare_fn)(const void *, const void *)) {
int num_deleted = 0;
for (int i = 0; i < num_contacts; i++) {
if (strstr(contacts[i].name, query) != NULL ||
strstr(contacts[i].phone, query) != NULL ||
strstr(contacts[i].email, query) != NULL) {
printf("已删除联系人:%s\t%s\t%s\n", contacts[i].name, contacts[i].phone, contacts[i].email);
num_deleted++;
} else {
contacts[i - num_deleted] = contacts[i];
}
}
num_contacts -= num_deleted;
return num_deleted;
}
int modify_contact(const char *query, int (*compare_fn)(const void *, const void *)) {
int num_modified = 0;
for (int i = 0; i < num_contacts; i++) {
if (strstr(contacts[i].name, query) != NULL ||
strstr(contacts[i].phone, query) != NULL ||
strstr(contacts[i].email, query) != NULL) {
printf("请输入新的联系人姓名(回车跳过):");
scanf("%s", contacts[i].name);
printf("请输入新的联系人电话(回车跳过):");
scanf("%s", contacts[i].phone);
printf("请输入新的联系人电子邮件(回车跳过):");
scanf("%s", contacts[i].email);
num_modified++;
}
}
return num_modified;
}
void sort_contacts(int (*compare_fn)(const void *, const void *)) {
qsort(contacts, num_contacts, sizeof(Contact), compare_fn);
printf("通讯录已按照指定方式排序!\n");
}
int main() {
while (1) {
printf("请输入操作编号:\n");
printf("1. 新建联系人\n");
printf("2. 模糊查找联系人\n");
printf("3. 删除联系人\n");
printf("4. 修改联系人信息\n");
printf("5. 按姓名排序联系人\n");
printf("6. 按电话号码排序联系人\n");
printf("7. 按电子邮件排序联系人\n");
printf("0. 退出程序\n");
int choice;
scanf("%d", &choice);
if (choice == 0) {
printf("谢谢使用,再见!\n");
return 0;
}
switch (choice) {
case 1:
add_contact();
break;
case 2: {
char query[MAX_NAME_LEN];
printf("请输入查询关键字:");
scanf("%s", query);
find_contacts(query, compare_contacts_by_name);
break;
}
case 3: {
char query[MAX_NAME_LEN];
printf("请输入删除关键字:");
scanf("%s", query);
int num_deleted = delete_contacts(query, compare_contacts_by_name);
printf("已删除 %d 个联系人!\n", num_deleted);
break;
}
case 4: {
char query[MAX_NAME_LEN];
printf("请输入修改关键字:");
scanf("%s", query);
int num_modified = modify_contact(query, compare_contacts_by_name);
printf("已修改 %d 个联系人!\n", num_modified);
break;
}
case 5:
sort_contacts(compare_contacts_by_name);
break;
case 6:
sort_contacts(compare_contacts_by_phone);
break;
case 7:
sort_contacts(compare_contacts_by_email);
break;
default:
printf("无效的操作编号,请重新输入!\n");
break;
}
}
}
```
该程序实现了以下功能:
- 新建联系人:输入联系人姓名、电话和电子邮件,将联系人添加到通讯录中;
- 模糊查找联系人:输入查询关键字,查找通讯录中包含该关键字的联系人,并输出联系人姓名、电话和电子邮件;
- 删除联系人:输入删除关键字,删除通讯录中包含该关键字的联系人;
- 修改联系人信息:输入修改关键字,修改通讯录中包含该关键字的联系人的姓名、电话和电子邮件;
- 个性化排序:按照姓名、电话或电子邮件排序通讯录中的联系人;
- 通讯录分组:该程序没有实现通讯录分组功能。
注意:该程序没有进行输入的错误处理,例如输入超过字符串长度限制、输入非法字符等情况会导致程序崩溃。实际应用中需要添加相应的错误处理代码。
阅读全文