c语言小项目——通讯录中阶(动态内存版)
发布人:shili8
发布时间:2025-01-08 15:04
阅读次数:0
**通讯录小项目——中阶版**
在前面的通讯录小项目中,我们实现了一个简单的通讯录程序,支持添加、删除、修改和查询联系人信息。然而,这个版本使用的是静态内存来存储联系人的信息,而不是动态内存。这意味着我们需要手动分配和释放内存来存储每个联系人的信息。
在这个中阶版的通讯录小项目中,我们将使用动态内存来存储联系人的信息。这样做可以更好地管理内存,避免内存泄漏等问题。
**程序结构**
我们的通讯录小项目将包含以下几个部分:
1. **通讯录类(ContactBook)**:负责管理整个通讯录的功能。
2. **联系人类(Contact)**:负责管理一个联系人的信息。
3. **菜单类(Menu)**:负责显示和处理用户的选择。
**通讯录类(ContactBook)**
c#include <stdio.h> #include <stdlib.h> // 联系人结构体typedef struct { char name[50]; int age; char phone[20]; } Contact; // 通讯录类typedef struct { Contact* contacts; // 联系人的数组 int size; // 当前联系人数量 int capacity; // 最大容量} ContactBook; // 初始化通讯录ContactBook* init_contact_book(int capacity) { ContactBook* contact_book = (ContactBook*)malloc(sizeof(ContactBook)); contact_book->contacts = (Contact*)malloc(capacity * sizeof(Contact)); contact_book->size =0; contact_book->capacity = capacity; return contact_book; } // 添加联系人void add_contact(ContactBook* contact_book, Contact contact) { if (contact_book->size < contact_book->capacity) { contact_book->contacts[contact_book->size] = contact; contact_book->size++; } else { printf("通讯录已满! "); } } // 删除联系人void delete_contact(ContactBook* contact_book, int index) { if (index >=0 && index < contact_book->size) { for (int i = index; i < contact_book->size -1; i++) { contact_book->contacts[i] = contact_book->contacts[i +1]; } contact_book->size--; } else { printf("联系人不存在! "); } } // 修改联系人void modify_contact(ContactBook* contact_book, int index, Contact new_contact) { if (index >=0 && index < contact_book->size) { contact_book->contacts[index] = new_contact; } else { printf("联系人不存在! "); } } // 查询联系人void query_contact(ContactBook* contact_book, int index) { if (index >=0 && index < contact_book->size) { Contact contact = contact_book->contacts[index]; printf("姓名:%s ", contact.name); printf("年龄:%d ", contact.age); printf("电话:%s ", contact.phone); } else { printf("联系人不存在! "); } } //释放通讯录内存void free_contact_book(ContactBook* contact_book) { free(contact_book->contacts); free(contact_book); }
**菜单类(Menu)**
c#include <stdio.h> // 显示菜单选项void show_menu() { printf("1. 添加联系人 "); printf("2. 删除联系人 "); printf("3. 修改联系人 "); printf("4. 查询联系人 "); printf("5.退出 "); } // 处理用户选择int handle_choice(int choice) { switch (choice) { case1: return1; case2: return2; case3: return3; case4: return4; case5: return0; default: printf("请输入正确的选项! "); return -1; } }
**联系人类(Contact)**
c#include <stdio.h> // 联系人结构体typedef struct { char name[50]; int age; char phone[20]; } Contact; // 初始化联系人void init_contact(Contact* contact) { printf("请输入姓名:"); scanf("%s", contact->name); printf("请输入年龄:"); scanf("%d", &contact->age); printf("请输入电话:"); scanf("%s", contact->phone); }
**main函数**
c#include <stdio.h> #include <stdlib.h> int main() { int choice; ContactBook* contact_book = init_contact_book(10); while (1) { show_menu(); printf("请输入选项:"); scanf("%d", &choice); choice = handle_choice(choice); if (choice ==0) { break; } else if (choice ==1) { Contact contact; init_contact(&contact); add_contact(contact_book, contact); } else if (choice ==2) { int index; printf("请输入要删除的联系人索引:"); scanf("%d", &index); delete_contact(contact_book, index); } else if (choice ==3) { int index; printf("请输入要修改的联系人索引:"); scanf("%d", &index); Contact contact; init_contact(&contact); modify_contact(contact_book, index, contact); } else if (choice ==4) { int index; printf("请输入要查询的联系人索引:"); scanf("%d", &index); query_contact(contact_book, index); } } free_contact_book(contact_book); return0; }
这个中阶版的通讯录小项目使用了动态内存来存储联系人的信息,更加高效地管理内存。同时,增加了菜单类和联系人类,使得程序结构更加清晰和易于维护。
**注意**
* 这个程序使用了动态内存分配和释放,需要手动释放内存来避免内存泄漏。
* 在添加、删除、修改和查询联系人的时候,都需要输入正确的索引号。
* 如果输入的选项不正确,会提示错误信息并继续运行。