实现通讯录要求
实现逻辑:
可以通过选项来选择不同的功能,功能完成后可以再次选择功能或者退出通讯录
通讯录中保存联系人的信息:
名字、年龄、性别、电话、住址(由此可见,要以结构体的方式实现)
有关结构体的知识请见: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);
// 成功添加一个联系人,所以有效联系人个数要自增1
pc->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);
// 在通讯录中查找指定联系人的名字,找到返回下标,没找到返回-1
int 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);
// 再把有效联系人个数自减1
printf("成功删除\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);
// 在通讯录中查找指定联系人的名字,找到返回下标,没找到返回-1
int 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);
// 在通讯录中查找指定联系人的名字,找到返回下标,没找到返回-1
int 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;
}