小编主页详情<-请点击
小编gitee代码仓库<-请点击


本文主要介绍了数据结构的顺序表的应用->通讯录,内容全由作者原创(无AI),同时深度解析了通讯录顺序表增删查改等功能,并带有配图帮助博友们更好的理解,点个关注不迷路,下面进入正文~~


目录

1.顺序表需要实现的功能

2.通讯录相关方法的具体实现

2.1通讯录数据的定义

2.2给通讯录改名字

2.3通讯录的初始化

2.4通讯录的销毁

2.5通讯录添加数据

2.6通讯录删除数据

2.7展示通讯录数据

2.8通讯录的修改

2.9通讯录查找

3.通讯录的具体实现

结语:


1.顺序表需要实现的功能

1.能够保存用户的信息:姓名 , 性别, 年龄, 电话,  地址。
2.实现初始化、销毁、添加、删除、修改、查找、显示用户信息的功能,代码如下图所示

//通讯录的初始化
void ContactInit(Contact* con);
//通讯录的销毁
void ContactDesTroy(Contact* con);
//通讯录添加数据
void ContactAdd(Contact* con);
//通讯录删除数据
void ContactDel(Contact* con);
//通讯录的修改
void ContactModify(Contact* con);
//通讯录查找
void ContactFind(Contact* con);
//展示通讯录数据
void ContactShow(Contact* con);

2.通讯录相关方法的具体实现

2.1通讯录数据的定义

我们的通讯录是建立在顺序表的基础上实现的,我们先回顾一下顺序表的内容

typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* arr;
	int size;
	int capacity;
}SL;

可以看到,顺序表中我们将int重命名为SLDateType,所以存储的是整形类型的元素。但是我们现在要存的是一个用户的具体信息,包含姓名、地址等信息,因此SLDateType代表的数据不应该是整形类型,而是一个包含用户具体信息的结构体

我们创建Contact.h头文件用来包含通讯录需要实现的功能,并将包含用户具体信息结构体的定义写在这个头文件中,同时SeqList.h包含Contact.h头文件

#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
typedef struct personInfo
{
	char name[NAME_MAX];
	char gender[GENDER_MAX];
	int age;
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}peoInfo;

为了方便后续代码的实现,我们将struct personInfo重命名成peoInfo,这个peoInfo就是我们顺序表应该要存的内容,所以我们将peoInfo重命名为SLDateType

//typedef int SLDataType;
typedef peoInfo SLDataType;

2.2给通讯录改名字

要用到顺序表相关的方法,对通讯录的操作实际就是对顺序表进行操作
给顺序表改个名字,叫做通讯录

typedef struct SeqList Contact;

需要注意,我们不能写成typedef SL Contact;
因为在这个Contact.h头文件里我们并没有包含SeqList.h(两个头文件不能互相包含,否则编译器会报错),即使由链接器,Contact.h头文件里也无法识别SL

2.3通讯录的初始化

通讯录的初始化实际上要进行的是顺序表的初始化,而顺序表的初始化已经实现好了,因此我们可以直接使用顺序表初始化的函数

void ContactInit(Contact* con)
{
	//实际上要进行的是顺序表的初始化
	//顺序表的初始化已经实现好了
	SLInit(con);
}

2.4通讯录的销毁

同样的,通讯录的销毁实际上要进行的是顺序表的销毁,因此我们可以直接使用顺序表销毁的函数

void ContactDesTroy(Contact* con)
{
	SLDestory(con);
}

2.5通讯录添加数据

实现的思路:
1.获取用户输入的内容:姓名+性别+年龄+电话+地址
2.往通讯录中添加联系人数据,我们在顺序表实现了头插和尾插的方法,可以任选一个使用,这里使用尾插的方法

void ContactAdd(Contact* con)
{
	//获取用户输入的内容:姓名+性别+年龄+电话+地址
	peoInfo info;
	printf("请输入要添加的练习人姓名:\n");
	scanf("%s", info.name);

	printf("请输入要添加的练习人性别:\n");
	scanf("%s", info.gender);

	printf("请输入要添加的练习人年龄:\n");
	scanf("%d", &info.age);

	printf("请输入要添加的练习人电话:\n");
	scanf("%s", info.tel);

	printf("请输入要添加的练习人地址:\n");
	scanf("%s", info.addr);

	//往通讯录中添加联系人数据
	SLPushBack(con, info);
}

注意:&info.age需要取地址

2.6通讯录删除数据

在删除数据之前我们先要判断删除的数据是否存在,如果数据不存在,则删除失败;如果存在,则删除数据。因此我们先实现一个判断数据是否存在的函数。这个数据包含姓名、性别、地址等信息,我们选择一个信息来判断这个数据是否存在,这里我们选择通过姓名判断。

int FindByName(Contact* con, char name[])
{
	for (int i = 0; i < con->size; i++)
	{
		if (strcmp(con->arr[i].name, name) == 0)
		{
			//找到了
			return i;
		}
	}
	//没有找到
	return -1;
}
//通讯录删除数据

在这个函数里,我们使用了strcmp函数来判断名字是否相同,若相同,则等于0;
当我们找到了对应的姓名,则返回对应的下标,方便数据的删除;如果没找到,则返回一个无效值-1
删除数据我们同样可以使用顺序表定义的函数SLErase

2.7展示通讯录数据

1.打印表头:姓名  性别 年龄 电话  地址
2.遍历通讯录,按照格式打印每个联系人数据

void ContactShow(Contact* con)
{
	//表头:姓名  性别 年龄 电话  地址
	printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
	//遍历通讯录,按照格式打印每个联系人数据
	for (int i = 0; i < con->size; i++)
	{
		printf("%4s %4s %4d %4s %4s\n",
			con->arr[i].name,
			con->arr[i].gender,
			con->arr[i].age,
			con->arr[i].tel,
			con->arr[i].addr
		);
	}
}

这里注意可以使用%4s向后对齐,保证数据的对齐,具体的对齐数据可以自行调试

2.8通讯录的修改

同样的,修改数据之前也需要判断数据是否存在,若存在,再进行修改

void ContactModify(Contact* con)
{
	char name[NAME_MAX];
	printf("请输入要修改的联系人姓名:\n");
	scanf("%s", name);
	int find = FindByName(con, name);
	if (find < 0)
	{
		printf("要修改的联系人姓名不存在!\n");
		return;
	}
	printf("请输入要修改的练习人姓名:\n");
	scanf("%s", con->arr[find].name);

	printf("请输入要修改的练习人性别:\n");
	scanf("%s", con->arr[find].gender);

	printf("请输入要修改的练习人年龄:\n");
	scanf("%d", &con->arr[find].age);

	printf("请输入要修改的练习人电话:\n");
	scanf("%s", con->arr[find].tel);

	printf("请输入要修改的练习人地址:\n");
	scanf("%s", con->arr[find].addr);

	printf("修改成功!\n");
}

2.9通讯录查找

1.打印表头:姓名  性别 年龄 电话  地址
2.判断数据是否存在,若存在,再打印数据

void ContactFind(Contact* con)
{
	char name[NAME_MAX];
	printf("请输入要查找的联系人姓名:\n");
	scanf("%s", name);
	int find = FindByName(con, name);
	if (find < 0)
	{
		printf("要查找的联系人姓名不存在!\n");
		return;
	}
	//表头:姓名  性别 年龄 电话  地址
	printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
	//遍历通讯录,按照格式打印查找联系人数据
	printf("%4s %4s %4d %4s %4s\n",
			con->arr[find].name,
			con->arr[find].gender,
			con->arr[find].age,
			con->arr[find].tel,
			con->arr[find].addr
		  );
}

3.通讯录的具体实现

1.打印目录
2.创建通讯录变量con
3.初始化通讯录
4.通过switch case语句选择要执行的功能
5.通过do while 循环执行打印目录和执行通讯录的功能
6.销毁通讯录
具体代码的呈现:

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:
			printf("选择错误!请重新选择!\n");
			break;
		}
	} while (op);
	ContactDesTroy(&con);
	return 0;
}

结语:

这篇文章全文由作者手写,图片由画图软件所制,无AI制作,希望各位博友能有所收获
欢迎各位博友的讨论,觉得不错的小伙伴,别忘了点赞关注哦~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐