【数据结构】顺序表的应用->通讯录(详细代码及配图)
本文主要介绍了数据结构的顺序表的应用->通讯录,内容全由作者原创(无AI),同时深度解析了通讯录顺序表增删查改等功能,并带有配图帮助博友们更好的理解,点个关注不迷路,下面进入正文~~
目录
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制作,希望各位博友能有所收获
欢迎各位博友的讨论,觉得不错的小伙伴,别忘了点赞关注哦~
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)