实现通讯录要求
实现逻辑:
可以通过选项来选择不同的功能,功能完成后可以再次选择功能或者退出通讯录
通讯录中保存联系人的信息:
名字、年龄、性别、电话、住址(由此可见,要以结构体的方式实现)
有关结构体的知识请见:C语言 ——— 结构体类型的声明、自引用、定义以及初始化-CSDN博客
需要实现的功能有:
1. 增加联系人(输入联系人的名字、年龄、性别、电话、住址)
2. 删除指定联系人
3. 查找指定联系人
4. 修改指定联系人
5. 显示所有联系人的信息
代码实现
test.c
#include"Contacts.h"int main()
{int input = 0;// 创建通讯录Contact con;// 初始化通讯录InitContact(&con);do{menu();printf("请选择:");scanf("%d", &input);switch (input){case ADD:AddContact(&con);break;case DEL:DelContact(&con);break;case SEARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW_ALL:Show_All_Contact(&con);break;case EXIT:ReleaseSpace(&con);printf("退出通讯录,程序结束\n");break;default:printf("输入错误,请重新输入\n");}} while (input);return 0;
}
Contacts.h
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30// 联系人的结构体声明
typedef struct PeoInfo
{char name[MAX_NAME]; //姓名int age; //年龄char sex[MAX_SEX]; //性别char tele[MAX_TELE]; //电话char addr[MAX_ADDR]; //住址
}PeoInfo;// 通讯录的结构体声明
typedef struct Contact
{PeoInfo* data; //指向联系人结构体的指针int size; //当前有效联系人个数int capacity; //当前最大容量
}Contact;// 各种功能的枚举
enum function
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW_ALL
};// 菜单
void menu();// 初始化通讯录
void InitContact(Contact* pc);// 添加联系人的信息
void AddContact(Contact* pc);// 展示所有联系人的信息
void Show_All_Contact(Contact* pc);// 删除指定联系人的信息
void DelContact(Contact* pc);// 查找指定联系人的信息
void SearchContact(Contact* pc);// 修改指定联系人的信息
void ModifyContact(Contact* pc);// 退出通讯录前,释放动态开辟的空间
void ReleaseSpace(Contact* pc);
Contacts.c
#include"Contacts.h"// 菜单
void menu()
{printf("*************************************\n");printf("***** 1.add 2.del *****\n");printf("***** 3.search 4.modify *****\n");printf("***** 5.show_all 0.exit *****\n");printf("*************************************\n");}// 初始化通讯录
void InitContact(Contact* pc)
{// 初始开辟5个联系人的空间pc->data = (PeoInfo*)malloc(sizeof(PeoInfo) * 5);// 判断是否开辟成功if (pc->data == NULL){perror("InitContact");return;}pc->size = 0;pc->capacity = 5;
}// 扩容
static void ExpansionContact(Contact* tmpc)
{// 每次扩容3个联系人的信息tmpc->capacity += 3;tmpc->data = (PeoInfo*)realloc(tmpc->data, sizeof(PeoInfo) * tmpc->capacity);// 判断是否扩容成功if (tmpc->data == NULL){perror("ExpansionContact");return;}printf("成功扩容\n");
}// 添加联系人的信息
void AddContact(Contact* pc)
{assert(pc);// 先判断通讯录是否满了if (pc->size == pc->capacity){// 扩容ExpansionContact(pc);}printf("请输入联系人的名字:");scanf("%s", pc->data[pc->size].name);printf("请输入联系人的年龄:");scanf("%d", &(pc->data[pc->size].age));printf("请输入联系人的性别:");scanf("%s", pc->data[pc->size].sex);printf("请输入联系人的电话:");scanf("%s", pc->data[pc->size].tele);printf("请输入联系人的住址:");scanf("%s", pc->data[pc->size].addr);// 成功添加一个联系人,所以有效联系人个数要自增1pc->size++;
}// 展示所有联系人的信息
void Show_All_Contact(Contact* pc)
{assert(pc);if (pc->size == 0){printf("当前通讯录并未存储联系人,无法显示\n");return;}printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n","姓名","年龄","性别","电话","住址");for (int i = 0; i < pc->size; i++){printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}
}// 查找指定联系人的名字,找到了返回下标,没找到返回-1
static int FindByName(Contact* tmpc, char* TmpDelName)
{for (int i = 0; i < tmpc->size; i++){// 找到了if (strcmp(tmpc->data[i].name, TmpDelName) == 0){return i;}}// 没找到return -1;
}// 删除指定联系人的信息
void DelContact(Contact* pc)
{assert(pc);// 当通讯录中没有存入联系人时if (pc->size == 0){printf("当前通讯录并未存储联系人,无法删除\n");return;}char DelName[MAX_NAME] = { 0 };printf("请输入要删除的联系人的姓名:");scanf("%s", DelName);// 在通讯录中查找指定联系人的名字,找到返回下标,没找到返回-1int i = FindByName(pc, DelName);// 判断是否查找到if (i == -1){printf("查无此人\n");return;}else{// 当要删除的联系人是存放在最后一个位置时if (i == pc->size - 1){// 直接将当前有效联系人个数自减1即可pc->size--;printf("成功删除\n");}else{// 先把最后一个联系人的信息覆盖到要删除的联系人的位置strcpy(pc->data[i].name, pc->data[pc->size - 1].name);pc->data[i].age = pc->data[pc->size - 1].age;strcpy(pc->data[i].sex, pc->data[pc->size - 1].sex);strcpy(pc->data[i].tele, pc->data[pc->size - 1].tele);strcpy(pc->data[i].addr, pc->data[pc->size - 1].addr);// 再把有效联系人个数自减1printf("成功删除\n");pc->size--;}}
}// 查找指定联系人的信息
void SearchContact(Contact* pc)
{assert(pc);// 当通讯录中没有存入联系人时if (pc->size == 0){printf("当前通讯录并未存储联系人,无法查找\n");return;}char SearchName[MAX_NAME] = { 0 };printf("请输入要查找的联系人的姓名:");scanf("%s", SearchName);// 在通讯录中查找指定联系人的名字,找到返回下标,没找到返回-1int i = FindByName(pc, SearchName);if (i == -1){printf("查无此人\n");return;}else{printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "住址");printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}
}// 修改指定联系人的信息
void ModifyContact(Contact* pc)
{assert(pc);// 当通讯录中没有存入联系人时if (pc->size == 0){printf("当前通讯录并未存储联系人,无法修改\n");return;}char SearchName[MAX_NAME] = { 0 };printf("请输入要修改的联系人的姓名:");scanf("%s", SearchName);// 在通讯录中查找指定联系人的名字,找到返回下标,没找到返回-1int i = FindByName(pc, SearchName);if (i == -1){printf("查无此人\n");return;}else{printf("请输入联系人的名字:");scanf("%s", pc->data[i].name);printf("请输入联系人的年龄:");scanf("%d", &(pc->data[i].age));printf("请输入联系人的性别:");scanf("%s", pc->data[i].sex);printf("请输入联系人的电话:");scanf("%s", pc->data[i].tele);printf("请输入联系人的住址:");scanf("%s", pc->data[i].addr);}
}// 退出通讯录前,释放动态开辟的空间
void ReleaseSpace(Contact* pc)
{// 释放free(pc->data);// 置空pc->data = NULL;// 置零pc->capacity = 0;pc->size = 0;
}