基于顺序表实现通讯录

上篇我们讲了顺序表是什么,和如何实现顺序表。这篇文章我们将基于顺序表来实现通讯录。在这里插入图片描述


前言

一、基于顺序表是如何实现的

在这里插入图片描述

我们之前实现顺序表的时候,顺序表储存的是整型类型的数据。我们要想实现通讯录的话,那么存储的类型应该是储存自定义类型的数据。这个自定义类型的数据应该是结构体。

二、通讯录的头文件和实现文件

通讯录的实现是基于顺序表的,所以我们要在顺序表这个项目中创建通讯录的头文件和实现文件。
在这里插入图片描述

三、通讯录的实现

3.1 定义通讯录结构

先在通讯录的头文件在定义通讯录的结构

#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDER_MAX 100

typedef struct personInfo
{
	char name[NAME_MAX];
	char gender[GENDER_MAX];
	int age;
	char tel[TEL_MAX];
	char adder[ADDER_MAX];
}peoInfo;

因为通讯录的实现是基于顺序表的,要将顺序表中存放的数组类型改为结构体类型,也就是我们定义的通讯录结构体。

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

注意不要忘了头文件。
在这里插入图片描述
下面就要在通讯录头文件中声明函数了,想一下。我们以后实现函数是不是要用到之前顺序表中定义好的函数。那么我们就应该在Contact.h头文件中引用顺序表的头文件。但是要注意一个问题。之前已经在顺序表头文件中引用了Contact.h这一头文件,如果再在通讯录头文件中引用SeqList.h这一头文件就重复了。所以在Contact.h中我们要前置声明一下。

typedef struct SeqList Contact;

在这里插入图片描述

3.2 初始化通讯录

在头文件中函数声明

void ContactInit(Contact* con);

在源文件中写具体的函数实现

void ContactInit(Contact* con)
{
	SLInit(con);
}

这里就非常简单了,因为我们之前已经在顺序表中实现了初始化函数,直接调用就可以了。

3.3 销毁通讯录

在头文件中函数声明

void ContactDesTroy(Contact* con)

在源文件中写具体的函数实现

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

这里和上面初始化通讯录一样。

3.4 通讯录添加数据

在头文件中函数声明

void ContactAdd(Contact* con)

在源文件中写具体的函数实现

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.adder);
	SLPushBack(con, info);
}

用peoInfo info创建一个新的 peoInfo 类型的变量,用于存储即将添加到联系人列表中的个人信息。
SLPushBack(con, info);用顺序表中的尾插函数在通讯录的顺序表中进行尾插。

3.5 查找联系人

在头文件中函数声明

int FindByName(Contact* con, char name[])

在源文件中写具体的函数实现

int FindByName(Contact* con, char name[])
{
	for (int i = 0;i<con->size;i++)
	{
		if (0 == strcmp(con->arr[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

遍历数组查找联系人。并且判断用到了一个strcmp函数。

3.6 删除联系人数据

在头文件中函数声明

void ContactDel(Contact* con)

在源文件中写具体的函数实现

void ContactDel(Contact* con)
{
	char name[NAME_MAX];
	printf("请输入要删除的姓名\n");
	scanf("%s", name);

	int find = FindByName(con, name);
	if (find < 0)
	{
		printf("要删除的联系人不在\n");
	}
	SLErase(con, find);
	printf("删除成功");
}

输入要找联系人的名字,用到上面我们写的查找联系人函数。如果找到了就删除,用到了顺序表中的删除函数。

3.7 通讯录联系人的修改

在头文件中函数声明

void ContactModify(Contact* con)

在源文件中写具体的函数实现

void ContactModify(Contact* con)
{
	char name[NAME_MAX];
	printf("请输入要修改的联系人数据");
	scanf("%s", name);
	int find = FindByName(con, name);
	if (find < 0)
	{
		printf("要修改的联系人不存在\n");
	}

	//姓名 性别 年龄 电话 地址
	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].adder);


}

输入要修改联系人的姓名,判断一下存不存在。存在就重新输入。

3.8 通讯录的查找

在头文件中函数声明

void ContactFind(Contact* con)

在源文件中写具体的函数实现

void ContactFind(Contact* con)
{
	char name[NAME_MAX];
	printf("请输入要查找的联系人\n");
	scanf("%s", name);

	int find = FindByName(con, name);
	if (find < 0)
	{
		printf("要查找的联系人不存在\n");
	}
	printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
	printf("%s %s %d %s %s\n",
		con->arr[find].name,
		con->arr[find].gender,
		con->arr[find].age,
		con->arr[find].tel,
		con->arr[find].adder);
}

输入要查找联系人的姓名,判断一下存不存在。存在就打印出来。

3.9 展示通讯录

在头文件中函数声明

void ContactShow(Contact* con)

在源文件中写具体的函数实现

void ContactShow(Contact* con)
{
	char name[NAME_MAX];
	int find = FindByName(con, name);
	if (find < 0)
	{
		printf("要查找的联系人不存在\n");
	}
	printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
	for (int i = 0; i < con->size; i++)
	{
		printf("%s %s %d %s %s\n",
			con->arr[find].name,
			con->arr[find].gender,
			con->arr[find].age,
			con->arr[find].tel,
			con->arr[find].adder);
	}
}

输入要查找联系人的姓名,判断一下存不存在。遍历数组,打印所有联系人的数据。

3.10 测试函数

#include"Contact.h"
#include"SeqList.h"
void meau()
{
	printf("************** 通讯录 *************\n");
	printf("******1.增加联系人 2.删除联系人******\n");
	printf("******3.修改联系人 4.查找联系人******\n");
	printf("******5.展示联系人 0.退出***********\n");
	printf("**********************************\n");

}

int main()
{
	int input = -1;
	Contact con;
	ContactInit(&con);
	do {
		meau();
		printf("请选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		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");
		}

	} while (input != 0);
	ContactDesTroy(&con);
	return 0;
}

相关推荐

  1. 实现通讯录顺序

    2024-04-15 02:36:03       11 阅读
  2. 顺序应用——通讯录实现

    2024-04-15 02:36:03       16 阅读
  3. 数据结构_基于顺序通讯录

    2024-04-15 02:36:03       12 阅读
  4. 数据结构——顺序实现通讯录

    2024-04-15 02:36:03       14 阅读
  5. 【数据结构】利用顺序实现通讯录

    2024-04-15 02:36:03       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-15 02:36:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-15 02:36:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-15 02:36:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-15 02:36:03       20 阅读

热门阅读

  1. Go 之常见的几种设计模式

    2024-04-15 02:36:03       16 阅读
  2. AcWing 794. 高精度除法——算法基础课题解

    2024-04-15 02:36:03       15 阅读
  3. lstm时间序列预测python

    2024-04-15 02:36:03       15 阅读
  4. 【LeetCode刷题记录】560. 和为 K 的子数组

    2024-04-15 02:36:03       12 阅读
  5. 文心一言VSchatGPT4

    2024-04-15 02:36:03       12 阅读
  6. 使用 bert-base-chinese-ner 模型实现中文NER

    2024-04-15 02:36:03       12 阅读
  7. Golang实践:用Sync.Map实现简易内存缓存系统

    2024-04-15 02:36:03       14 阅读
  8. Sql缺失索引查询,自动创建执行语句

    2024-04-15 02:36:03       13 阅读
  9. 【SpinalHDL】Scala编程中的class及case class

    2024-04-15 02:36:03       13 阅读