通訊錄是我們日常生活中常用的工具之一,它可以幫助我們存儲和管理聯系人信息。在本文中,我們將使用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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。