通讯录项目——顺序表的应用

前言

基于上节讲解的顺序表,这里我们将其应用实现通讯录项目

http://t.csdnimg.cn/FZQjN

一.通讯录的实现

1.前期准备

1.1C语言基础要求

结构体、动态内存管理、顺序表

1.2初始界面菜单的实现

这里与之前扫雷游戏的实现类似,就是printf函数的打印

通讯录项目——顺序表的应用_第1张图片

//通讯录菜单
void menu()
{
	printf("****************通讯录******************\n");
	printf("*******1.添加联系人  2.删除联系人*******\n");
	printf("*******3.修改联系人  4.查找联系人*******\n");
	printf("*******5.查看联系人  0. 退 出 **********\n");
	printf("****************************************\n");
}
int main()
{
	int op = -1;
	//创建通讯录结构对象
	Contact con;
	ContactInit(&con);
	do
	{
		menu();
		printf("请选择你的操作:\n");
		scanf("%d", &op);

		switch (op)
		{
		case 1:
			//添加联系人
			ContactAdd(&con);
			break;
		case 2:
			//删除联系人
			ContactDel(&con);
			break; 
		case 3:
			//修改联系人
			ContactModify(&con);
			break; 
		case 4:
			//查找联系人
			ContactFind(&con);
			break; 
		case 5:
			//查看通讯录
			ContactShow(&con);
			break;
		case 0:
			//退出
			printf("通讯录退出中\n");
			break;
		default:
			break;
		}
	} while (op != 0);
	//销毁通讯录
	ContactDesTroy(&con);
	return 0;
}

1.3结构体的创建

第一个是每个用户的个人信息,包括名字,年龄,性别,电话,地址

第二个将每个用户的信息存储构成通讯录

//通讯录数据类型
typedef struct PersonInfo
{
	char name[NAME_MAX];
	int age;
	char gender[GENDER_MAX];
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}Info;
typedef struct SeqList
{
	SLDataType* arr;//存储数据的底层结构
	int capacity;//记录顺序表的空间大小
	int size;//记录顺序表当前有效的数据个数
}SL;

1.4头文件的引用、变量的定义、声明

通过宏定义,便于我们将来的修改值

通讯录项目——顺序表的应用_第2张图片通讯录项目——顺序表的应用_第3张图片

#define NAME_MAX 100
#define GENDER_MAX 10
#define TEL_MAX 12
#define ADDR_MAX 100

2.功能实现

2.1初始化和销毁

这里应用的顺序表的初始化和销毁

//通讯录的初始化和销毁
void ContactInit(Contact* pcon)
{
	SLInit(pcon);
}

void ContactDesTroy(Contact* pcon)
{
	SLDestroy(pcon);
}

2.2增加

通过顺序表的后插,进行增加

void ContactAdd(Contact* pcon)
{
	//创建联系人结构体变量
	Info info;

	printf("请输入联系人姓名:\n");
	scanf("%s", info.name);
	printf("请输入联系人年龄:\n");
	scanf("%d", &info.age);
	printf("请输入联系人性别:\n");
	scanf("%s", info.gender);
	printf("请输入联系人电话:\n");
	scanf("%s", info.tel);
	printf("请输入联系人地址:\n");
	scanf("%s", info.addr);

	//保存数据到通讯录(顺序表)
	SLPushBack(pcon, info);//后插

}

2.3删除

删除不同于添加,需要先判断是否有该用户,这里我们通过遍历名字查找是否存在该用户

PS:也可以通过其他特征(如电话、地址),最好是唯一特征,这样才准确

int	FindByName(Contact* pcon, char name[])
{
	for (int i = 0; i < pcon->size; i++)
	{
		if (strcmp(pcon->arr[i].name, name) == 0)
		{
			//找到了
			return i;
		}
	}
	return -1;
}
void ContactDel(Contact* pcon)
{
	//删除之前,一定要先查找
	//找到了,可以删除
	//找不到不能执行删除
	printf("请输入要删除的联系人的姓名\n");
	char name[NAME_MAX];
	scanf("%s", name);

	int FindIndex = FindByName(pcon, name);
	if (FindIndex < 0)
	{
		printf("要删除的联系人不存在\n");
		return;
	}
	//执行删除程序
	SLErase(pcon, FindIndex);
	printf("联系人删除成功!\n");
}

2.4修改

与删除一样,都需要判断是否存在该用户,这里直接调用上面的函数即可

void ContactModify(Contact* pcon)
{
	//修改之前要先查找
	//找到了,执行修改操作
	//没有找到,不能执行修改操作

	char name[NAME_MAX];
	printf("请输入要修改的联系人姓名:\n");
	scanf("%s", name);

	int FindIndex = FindByName(pcon, name);
	if (FindIndex < 0)
	{
		printf("要修改的联系人不存在\n");
		return;
	}
	//找到了,执行修改程序
	printf("请输入姓名:\n");
	scanf("%s", pcon->arr[FindIndex].name);
	printf("请输入年龄:\n");
	scanf("%d", &pcon->arr[FindIndex].age);
	printf("请输入性别:\n");
	scanf("%s", pcon->arr[FindIndex].gender);
	printf("请输入电话:\n");
	scanf("%s", pcon->arr[FindIndex].tel);
	printf("请输入地址:\n");
	scanf("%s", pcon->arr[FindIndex].addr);

	printf("联系人修改成功\n");
}

2.5查找

查找类似,如果找到即打印信息

void ContactFind(Contact* pcon)
{
	char name[NAME_MAX];
	printf("请输入要查找的用户名\n");
	scanf("%s", name);

	int FindIndex = FindByName(pcon, name);
	if (FindIndex < 0)
	{
		printf("该联系人不存在\n");
		return;
	}
	//找到了,打印下联系人信息
	printf("%-10s  %-10s  %-5s  %-12s  %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
	printf("%-10s  %-10s  %-5d  %-12s  %-20s\n",
		pcon->arr[FindIndex].name,
		pcon->arr[FindIndex].gender,
		pcon->arr[FindIndex].age,
		pcon->arr[FindIndex].tel,
		pcon->arr[FindIndex].addr
	);
}

2.6查看

通讯录项目——顺序表的应用_第4张图片

void ContactShow(Contact* pcon)
{
	printf("%-10s  %-10s  %-5s  %-12s  %-20s\n", "姓名", "性别", "年龄", "电话", "地址");

	for (int i = 0; i < pcon->size; i++)
	{
		printf("%-10s  %-10s  %-5d  %-12s  %-20s\n",
			pcon->arr[i].name,
			pcon->arr[i].gender,
			pcon->arr[i].age,
			pcon->arr[i].tel,
			pcon->arr[i].addr
		);//这样写更美观
	}
}

二.优化

1.文件操作

我们是否能够通过前面学过的文件操作来进行保存呢?使得信息不丢失

2.静态顺序表实现

我们这里使用的动态顺序表来实现,我们是否可以用静态的实现呢?

3.扩展功能

除了姓名、性别、年龄、电话、地址等功能外,是否还可以增加其他的功能职位,生日)?


如果上述内容对您有帮助,希望给个三连谢谢 
通讯录项目——顺序表的应用_第5张图片

你可能感兴趣的:(笔记,前端,c语言,开发语言,vscode,笔记,经验分享)