实现一个通讯录:
通讯录可以用来存储个人信息,当通讯录空间已满时,可以自动扩充通讯录的存储空间,每个人的信息包括:姓名、性别、年龄、电话、住址。
提供方法:
1.添加联系人信息;
2.删除指定联系人信息;
3.查找指定联系人信息;
4.修改指定联系人信息;
5.显示所有联系人信息;
6.清空所有联系人;
7.以名字排序所有联系人。
根据上述需求,我们依次定义出所需要的结构体、自定义函数等等。
个人信息结构体定义:
#define MAX_NAME_SIZE 20 #define MAX_SEX_SIZE 3 #define MAX_TEL_SIZE 12 #define MAX_ADDR_SIZE 256 typedef struct PersonInfo { char name[MAX_NAME_SIZE]; char sex[MAX_SEX_SIZE]; int age; char tel[MAX_TEL_SIZE]; char address[MAX_ADDR_SIZE]; }PersonInfo;
在定义了个人信息结构体后,还需要定义出通讯录结构体,按照满足题目要求 “当通讯录空间已满时,可以自动扩充通讯录的存储空间”,通讯录结构体定义如下:
typedef struct Contact { PersonInfo* pCont; size_t capacity;//通讯录的最大容量 size_t size; };
根据题目要求,初步定义出以下函数接口:
void InitContact(Contact* pcnt);//初始化通讯录 void AddContact(Contact* pcnt);//添加联系人信息 void DelContact(Contact* pcnt);//删除指定联系人信息 void FindContact(Contact* pcnt);//查找指定联系人信息 void ModifyContact(Contact* pcnt);//修改指定联系人信息 void ShowContact(Contact* pcnt);//显示所有联系人信息 void ClearContact(Contact* pcnt);//清除所有联系人 void SortContact(Contact* pcnt);//以名字排序所有联系人
根据题目要求,利用顺序表的相关知识实现通讯录管理系统,代码如下:
#define _CRT_SECURE_NO_WARNINGS #include#include #include #define MAX_NAME_SIZE 20 #define MAX_SEX_SIZE 3 #define MAX_TEL_SIZE 12 #define MAX_ADDR_SIZE 256 #define DEFAULT_CONTACT_SIZE 128//通讯录默认空间大小 #define CONTACT_INC_SIZE 20//通讯录空间每次扩容大小 enum { QUIT, ADD, DEL, FIND, MODIFY, SHOW, CLEAR, SORT }; typedef struct PersonInfo { char name[MAX_NAME_SIZE]; char sex[MAX_SEX_SIZE]; int age; char tel[MAX_TEL_SIZE]; char address[MAX_ADDR_SIZE]; }PersonInfo; typedef struct Contact { PersonInfo* pCont; size_t capacity; size_t size; }Contact; //函数声明 void InitContact(Contact* pcnt);//初始化通讯录 void AddContact(Contact* pcnt);//添加联系人信息 void DelContact(Contact* pcnt);//删除指定联系人信息 void FindContact(Contact* pcnt);//查找指定联系人信息 void ModifyContact(Contact* pcnt);//修改指定联系人信息 void ShowContact(Contact* pcnt);//显示所有联系人信息 void ClearContact(Contact* pcnt);//清除所有联系人 void SortContact(Contact* pcnt);//以名字排序所有联系人 void DestroyContact(Contact* pcnt);//程序结束时摧毁通讯录,防止内存泄漏 int FindByName(Contact* pcnt, char Name[]); bool CheckCapacity(Contact* pcnt); bool IsEmpty(Contact* pcnt); int main(int argc, char* argv[]) { //初始化通讯录 Contact cont; InitContact(&cont); int select = 1; while (select) { printf("**************通 讯 录*****************n"); printf("* [1] Add [2] Del *n"); printf("* [3] Find [4] Modify *n"); printf("* [5] Show [6] Clear *n"); printf("* [7] Sort [0] Quit System *n"); printf("***************************************n"); printf("请选择:>"); scanf("%d", &select); if (select == QUIT) break; switch (select) { case ADD: AddContact(&cont); break; case DEL: DelContact(&cont); break; case FIND: FindContact(&cont); break; case MODIFY: ModifyContact(&cont); break; case SHOW: ShowContact(&cont); break; case CLEAR: ClearContact(&cont); break; case SORT: SortContact(&cont); break; } } printf("GoodBye,退出通讯录系统...n"); DestroyContact(&cont); return 0; } void InitContact(Contact* pcnt) { pcnt->pCont = (PersonInfo*)malloc(sizeof(PersonInfo) * DEFAULT_CONTACT_SIZE); memset(pcnt->pCont, 0, sizeof(PersonInfo) * DEFAULT_CONTACT_SIZE);//将开辟的空间全部初始化为0 pcnt->capacity = DEFAULT_CONTACT_SIZE; pcnt->size = 0; } bool CheckCapacity(Contact* pcnt) { if (pcnt->size >= pcnt->capacity) { //扩容 PersonInfo* new_cont = (PersonInfo*)realloc(pcnt->pCont, sizeof(PersonInfo) * (pcnt->capacity + CONTACT_INC_SIZE)); if (pcnt->pCont == NULL) return false; pcnt->pCont = new_cont; pcnt->capacity += CONTACT_INC_SIZE; printf("扩容成功.n"); } return true; } bool IsEmpty(Contact* pcnt) { return pcnt->size == 0; } void AddContact(Contact* pcnt) { if (!CheckCapacity(pcnt)) { printf("通讯录已满,不能增加联系人信息...n"); return; } printf("姓名:>"); scanf("%s", pcnt->pCont[pcnt->size].name); printf("性别:>"); scanf("%s", pcnt->pCont[pcnt->size].sex); printf("年龄:>"); scanf("%d", &pcnt->pCont[pcnt->size].age); printf("电话:>"); scanf("%s", pcnt->pCont[pcnt->size].tel); printf("住址:>"); scanf("%s", pcnt->pCont[pcnt->size].address); pcnt->size++; printf("增添联系人信息成功...n"); } void DelContact(Contact* pcnt) { printf("请输入要删除的联系人姓名:>"); char Name[MAX_NAME_SIZE]; scanf("%s", Name); int index = FindByName(pcnt, Name); if (index = -1) { printf("要删除的联系人不存在...n"); return; } for (int i = index; i < pcnt->size; i++) { pcnt->pCont[i] = pcnt->pCont[i + 1]; } pcnt->size--; printf("删除信息成功...n"); } void FindContact(Contact* pcnt) { if (IsEmpty(pcnt)) { printf("通讯录为空,不能查找...n"); return; } char Name[MAX_NAME_SIZE]; scanf("%s", Name); int index = FindByName(pcnt, Name); if (index = -1) { printf("要查找的联系人不存在...n"); return; } printf("%-8s%-6s%-6d%-13s%sn", pcnt->pCont[index].name, pcnt->pCont[index].sex, pcnt->pCont[index].age, pcnt->pCont[index].tel, pcnt->pCont[index].address); } void ModifyContact(Contact* pcnt) { if (IsEmpty(pcnt)) { printf("通讯录为空,不能修改...n"); return; } char Name[MAX_NAME_SIZE]; scanf("%s", Name); int index = FindByName(pcnt, Name); if (index = -1) { printf("要修改的联系人不存在...n"); return; } printf("%s", "你想修改什么信息(1-姓名 2-性别 3-年龄 4-电话 5-住址)"); int select; scanf("%d", &select); switch (select) { case 1: printf("请输入要修改的姓名:>"); scanf("%s", pcnt->pCont[index].name); break; case 2: printf("请输入要修改的性别:>"); scanf("%s", pcnt->pCont[index].sex); break; case 3: printf("请输入要修改的年龄:>"); scanf("%d", &pcnt->pCont[index].age); break; case 4: printf("请输入要修改的电话:>"); scanf("%s", pcnt->pCont[index].tel); break; case 5: printf("请输入要修改的住址:>"); scanf("%s", pcnt->pCont[index].address); break; } printf("修改信息成功...n"); } void ShowContact(Contact* pcnt) { printf("%-8s%-6s%-6s%-13s%sn", "姓名", "性别", "年龄", "电话", "地址"); for (int i = 0; i < pcnt->size; ++i) { printf("%-8s%-6s%-6d%-13s%sn", pcnt->pCont[i].name, pcnt->pCont[i].sex, pcnt->pCont[i].age, pcnt->pCont[i].tel, pcnt->pCont[i].address); } } void ClearContact(Contact* pcnt) { printf("是否确定清除通讯录 :>"); fflush(stdin); //清除上一次的n char ch = getchar(); if (ch == 'N' || ch == 'n') { printf("清除通讯录取消....n"); return; } else if (ch == 'Y' || ch == 'y') { pcnt->size = 0; printf("清除通讯录成功....n"); return; } printf("输入错误.....n"); } void SortContact(Contact* pcnt) { for (int i = 0; i < pcnt->size - 1; ++i) { for (int j = 0; j < pcnt->size - i - 1; ++j) { if (strcmp(pcnt->pCont[j].name, pcnt->pCont[j + 1].name) > 0) { PersonInfo tmp = pcnt->pCont[j]; pcnt->pCont[j] = pcnt->pCont[j + 1]; pcnt->pCont[j + 1] = tmp; } } } printf("排序成功.n"); } void DestroyContact(Contact* pcnt) { free(pcnt->pCont); pcnt->pCont = NULL; pcnt->capacity = pcnt->size = 0; } int FindByName(Contact* pcnt, char Name[]) { for (int i = 0; i < pcnt->size; i++) { if (strcmp(pcnt->pCont[i].name, Name) == 0) return i; } return -1; }
部分调试界面:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)