c语言编程笔录

首页 > C语言 > c语言

c语言

C语言示例讲解动态文件静态功能版本的通讯录实现

更新时间:2023-08-09

前言

通讯录是一个常见的应用程序,用于存储个人或组织的联系信息。在这个示例中,我们将使用C语言来实现一个通讯录,包括动态、文件和静态功能版本。动态版本使用内存动态分配来存储通讯录条目,文件版本将联系信息保存到文件中,静态版本使用静态数组来存储数据。

动态版本

在动态版本中,我们使用malloc()函数动态分配内存来存储通讯录。每个通讯录条目都是一个结构体,其中包含姓名、电话号码和电子邮件地址等信息。我们可以使用指针数组来保存每个通讯录条目的地址,并使用循环来遍历和操作通讯录。例如,我们可以实现添加、删除和修改条目的功能。

#include 
#include 
#include 

#define MAX_ENTRIES 100

typedef struct {
    char name[50];
    char phone[20];
    char email[50];
} Contact;

int main() {
    Contact* contacts[MAX_ENTRIES];
    int num_entries = 0;
    
    // 添加条目
    contacts[num_entries] = (Contact*)malloc(sizeof(Contact));
    strcpy(contacts[num_entries]->name, "张三");
    strcpy(contacts[num_entries]->phone, "1234567890");
    strcpy(contacts[num_entries]->email, "zhangsan@example.com");
    num_entries++;
    
    // 修改条目
    strcpy(contacts[0]->phone, "9876543210");
    
    // 删除条目
    free(contacts[0]);
    for (int i = 0; i < num_entries-1; i++) {
        contacts[i] = contacts[i+1];
    }
    num_entries--;
    
    return 0;
}

文件版本

在文件版本中,我们使用文件来保存通讯录的数据。我们可以使用文件读写操作来实现添加、删除和修改通讯录条目。为了保持数据的一致性,我们可以定义一种文件格式,将每个条目以特定的格式存储在文件中。

#include 
#include 

typedef struct {
    char name[50];
    char phone[20];
    char email[50];
} Contact;

void addContactToFile(Contact* contact) {
    FILE* file = fopen("contacts.txt", "a");
    fwrite(contact, sizeof(Contact), 1, file);
    fclose(file);
}

void deleteContactFromFile(const char* name) {
    FILE* file = fopen("contacts.txt", "r+");
    Contact contact;
    while (fread(&contact, sizeof(Contact), 1, file)) {
        if (strcmp(contact.name, name) == 0) {
            fseek(file, -sizeof(Contact), SEEK_CUR);
            fwrite(&contact, sizeof(Contact), 1, file);
        }
    }
    fclose(file);
}

void updateContactInFile(const char* name, Contact* newContact) {
    FILE* file = fopen("contacts.txt", "r+");
    Contact contact;
    while (fread(&contact, sizeof(Contact), 1, file)) {
        if (strcmp(contact.name, name) == 0) {
            fseek(file, -sizeof(Contact), SEEK_CUR);
            fwrite(newContact, sizeof(Contact), 1, file);
        }
    }
    fclose(file);
}

int main() {
    // 添加条目到文件中
    Contact contact;
    strcpy(contact.name, "李四");
    strcpy(contact.phone, "0987654321");
    strcpy(contact.email, "lisi@example.com");
    addContactToFile(&contact);
    
    // 从文件中删除条目
    deleteContactFromFile("张三");
    
    // 在文件中更新条目
    Contact newContact;
    strcpy(newContact.name, "王五");
    strcpy(newContact.phone, "5678901234");
    strcpy(newContact.email, "wangwu@example.com");
    updateContactInFile("李四", &newContact);
    
    return 0;
}

静态版本

在静态版本中,我们使用静态数组来存储通讯录的数据。这意味着通讯录的大小是固定的,无法超出预先定义的数组大小。我们可以使用循环遍历和操作静态数组来实现添加、删除和修改通讯录条目的功能。

#include 
#include 

#define MAX_ENTRIES 100

typedef struct {
    char name[50];
    char phone[20];
    char email[50];
} Contact;

void addContact(Contact* contacts, const Contact* newContact, int* num_entries) {
    if (*num_entries < MAX_ENTRIES) {
        contacts[*num_entries] = *newContact;
        (*num_entries)++;
    }
}

void deleteContact(Contact* contacts, const char* name, int* num_entries) {
    for (int i = 0; i < *num_entries; i++) {
        if (strcmp(contacts[i].name, name) == 0) {
            for (int j = i; j < *num_entries-1; j++) {
                contacts[j] = contacts[j+1];
            }
            (*num_entries)--;
        }
    }
}

void updateContact(Contact* contacts, const char* name, const Contact* newContact, int num_entries) {
    for (int i = 0; i < num_entries; i++) {
        if (strcmp(contacts[i].name, name) == 0) {
            contacts[i] = *newContact;
        }
    }
}

int main() {
    Contact contacts[MAX_ENTRIES];
    int num_entries = 0;
    
    // 添加条目
    Contact newContact = {"赵六", "5678912345", "zhaoliu@example.com"};
    addContact(contacts, &newContact, &num_entries);
    
    // 删除条目
    deleteContact(contacts, "李四", &num_entries);
    
    // 修改条目
    Contact updatedContact = {"王五", "9876543210", "wangwu@example.com"};
    updateContact(contacts, "赵六", &updatedContact, num_entries);
    
    return 0;
}

总结

通过使用C语言,我们实现了动态、文件和静态版本的通讯录。动态版本使用内存动态分配来存储数据,文件版本将数据保存到文件中,而静态版本使用静态数组来存储数据。每个版本都有自己的优势和限制,根据具体需求选择合适的版本。这个示例提供了一个基本的框架,你可以根据自己的需求进行修改和扩展。