前言:
通过对数据结构--顺序表的学习,了解了顺序表的增加数据,删除数据等功能;我们就可以基于顺序表来实现通讯录,接下来就一起来实现通讯录。
首先我们需要存储通讯录中联系人信息,这里创建一个结构体,
存储联系人姓名、性别、年龄、电话、住址等信息
#define NAME_MAX 20
#define GENDER_MAX 20
#define TEL_MAX 20
#define ADDR_MAX 50
typedef struct personinfo //联系人信息
{
char name[NAME_MAX];//姓名
char gender[GENDER_MAX];//性别
int age; //年龄
char tel[TEL_MAX];//电话
char addr[ADDR_MAX];//住址
}person;
这里使用#define定义常量,以后方便修改
现在创建好了应该结构体(联系人信息)那又如何有顺序表来实现呢?
在数据结构--顺序表中,实现顺序表时,存储的是整形数据,那现在需要将用户信息存储起来,我们就让顺序表存储的数据是我们结构体(联系人信息)。
这里只需将数据类型中 int 改为 结构体类型即可;
typedef struct personinfo Type;//person
因为在结构体定义时就重命名为了person,这里可以使用person替换struct personinfo
当然,为了方便操作,我们也会将(动态)顺序表(SeqList)重命名成通讯录(Contact)
不过这里需要注意的时:我们是基于顺序表来实现通讯录,我们需要通讯录的头文件,也需要用到顺序表的相关代码,两个头文件在使用时都会用到另一个头文件的东西,而头文件又不能相互包含,(这里在通讯录头文件Contact.h中只需声明顺序表结构体就可以了(不可以直接使用重命名后的结构体名)),顺序表实现的头文件直接包含Contact.h即可(因为会涉及到数据类型重命名和插入、查找数据等)。
到这里,对于通讯录的实现准备工作已经做的差不多了,接下来就来就实现通讯录:
通讯录功能预览:
我们想要通讯录实现以下几种功能:
- 能够保存联系人信息姓名、性别、年龄、电话、地址等
- 增加联系人信息
- 删除指定联系人
- 查找指定联系人
- 修改指定联系人
- 显示联系人信息
先来看以下这些功能实现代码的头文件
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#define NAME_MAX 20
#define GENDER_MAX 20
#define TEL_MAX 20
#define ADDR_MAX 50
typedef struct personinfo //联系人信息
{
char name[NAME_MAX];//姓名
char gender[GENDER_MAX];//性别
int age; //年龄
char tel[TEL_MAX];//电话
char addr[ADDR_MAX];//住址
}person;
typedef struct SeqList Con;//重命名顺序表
//通讯录初始化
void ConInit(Con* con);
//通讯录销毁
void ConDesTroy(Con* con);
//查看通讯录
void ConShow(Con* con);
//添加联系人
void ConAdd(Con* con);
//修改联系人
void Conrev(Con* con);
//删除联系人
void ConDel(Con* con);
//查找联系人
void ConFind(Con* con);
接下来就一一实现这些功能函数
通讯录初始化
通讯录销毁
通讯录的初始化和销毁其实就是顺序表的初始化和销毁,这里直接使用顺序表的初始化和销毁函数即可。
//通讯录初始化
void ConInit(Con* con)
{
SLInit(con);
}
//通讯录销毁
void ConDesTroy(Con* con)
{
SLDesTroy(con);
}
查看通讯录
这里查看联系人信息也就是将联系人信息输出(打印)到电脑屏幕上,先看以下预期效果图
这样在下面依次输出即可,这里就需要一些格式
//查看通讯录
void ConShow(Con* con)
{
printf("%-10s%-10s%-10s%-10s%-10s\n", "姓名", "性别", "年龄", "电话", "住址");
for (int i = 0; i < con->size; i++)
{
printf("%-10s%-10s%-10d%-10s%-10s\n",
con->arr[i].name,
con->arr[i].gender,
con->arr[i].age,
con->arr[i].tel,
con->arr[i].addr);
}
}
我这里使用%-10s(%-10d)来限制输出对齐的格式%-10d是靠左对齐。(这里也可以给更多%-20d等)
添加联系人
接下来就是添加联系人信息,这个这里就先从键盘上读取数据存储进来
}
//添加联系人
void ConAdd(Con* con)
{
person psi;
printf("请输入添加的联系人姓名:\n");
scanf("%s", psi.name);
printf("请输入添加的联系人性别:\n");
scanf("%s", psi.gender);
printf("请输入添加的联系人年龄:\n");
scanf("%d", &psi.age);
printf("请输入添加的联系人电话:\n");
scanf("%s", psi.tel);
printf("请输入添加的联系人住址:\n");
scanf("%s", psi.addr);
SLAddEnd(con, psi);
printf("添加成功\n");
}
这里也可以像下面这种方式直接输入到顺序表数据中。
//添加联系人
void ConAdd(Con* con)
{
if (con->size >= con->num) {
Conzengrong(con);
}
printf("请输入添加联系人的姓名:\n");
scanf("%s", con->arr[con->size].name);
printf("请输入添加联系人的性别:\n");
scanf("%s", con->arr[con->size].gender);
printf("请输入添加联系人的年龄:\n");
scanf("%d", &con->arr[con->size].age);
printf("请输入添加联系人的电话:\n");
scanf("%s", con->arr[con->size].tel);
printf("请输入添加联系人的地址:\n");
scanf("%s", con->arr[con->size].addr);
printf("添加成功\n");
con->size++;
}
但我们这是基于顺序表来实现的通讯录,这里就使用第一种方式。
这里就不一一测试了;
删除联系人
删除联系人,我们首先要找到这个联系人信息,就要先写一个函数先找到联系人信息(在查找联系人,修改联系人都会用到):
//按照名字查找
int Find_name(Con* con, char* name)
{
for (int i = 0; i < con->size; i++)
{
if (strcmp(con->arr[i].name, name) == 0)
{
return i;
}
}
return -1;
}
这里如果找到联系人数据,就返回其下标,如果找不到就返回-1;
接下来就通过查找函数的返回值来删除数据:这里会用到顺序表中删除指定位置的函数
//删除联系人
void ConDel(Con* con)
{
char name[NAME_MAX];
printf("请输入删除的联系人姓名:\n");
scanf("%s", name);
int find = Find_name(con, name);
if (find < 0)
{
printf("需要删除的联系人不存在\n");
return;
}
SLDeleve(con, find);
printf("删除成功\n");
}
当然这里也可以不使用顺序表的函数,直接进行查找到下标如何进行删除,这里就不添加这种方式的代码了,(其实就是将顺序表的代码写到这个函数中)
查找联系人
与删除函数相同的是,查找也需要先找到指定联系人的下标,再通过下标将数据输出出来
代码如下:
//查找联系人
void ConFind(Con* con)
{
char name[NAME_MAX];
printf("请输入查找的联系人姓名:\n");
scanf("%s", name);
int find = Find_name(con, name);
if (find < 0)
{
printf("查找的联系人不存在\n");
return;
}
printf("查找成功\n");
printf("%-10s%-10s%-10s%-10s%-10s\n", "姓名", "性别", "年龄", "电话", "住址");
printf("%-10s%-10s%-10d%-10s%-10s\n",
con->arr[find].name,
con->arr[find].gender,
con->arr[find].age,
con->arr[find].tel,
con->arr[find].addr);
}
修改联系人
修改与删除和查找都需要先找到指定联系人数据的下标,再通过下标对联系人信息进行操作
//修改联系人
void Conrev(Con* con)
{
char name[NAME_MAX];
printf("请输入需要修改的联系人姓名:\n");
scanf("%s", name);
int find = Find_name(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");
}
到这里通讯录的基本代码已经完了,先来写测试代码来测试以下
测试代码test.c:
#include"SeqList.h"
void Contact()
{
int n = 0;
Con con;
ConInit(&con);
do
{
printf("******************************通讯录******************************\n");
printf("********************1.添加联系人 2.删除联系人********************\n");
printf("********************3.修改联系人 4.查找联系人********************\n");
printf("********************5.查看通讯录 0.退出通讯录********************\n");
printf("******************************************************************\n");
printf("------------------------------请选择------------------------------\n");
scanf("%d", &n);
switch (n)
{
case 1:
ConAdd(&con);
break;
case 2:
ConDel(&con);
break;
case 3:
Conrev(&con);
break;
case 4:
ConFind(&con);
break;
case 5:
ConShow(&con);
break;
case 0:
break;
default:
printf("输入错误,请重新输入\n");
}
} while (n);
ConDesTroy(&con);
}
int main()
{
Contact();
return 0;
}
结果预览
顺序表实现通讯录
当然这样写,我们的通讯录信息再程序结束后就丢失了,要想长久保存,我们就要将通讯录信息写到文件中,文件操作相关知识在之前有所了解
这里就不进行文件相关操作了,可以自行尝试
代码总览
有很多是顺序表实现的相关代码,这里可以直接拿来用,这里只展示通讯录的相关代码,顺序表的代码可以查看上篇文章 顺序表。
Contact.c
#include"SeqList.h"
#include"Contact.h"
//通讯录初始化
void ConInit(Con* con)
{
SLInit(con);
}
//通讯录销毁
void ConDesTroy(Con* con)
{
SLDesTroy(con);
}
//查看通讯录
void ConShow(Con* con)
{
printf("%-10s%-10s%-10s%-10s%-10s\n", "姓名", "性别", "年龄", "电话", "住址");
for (int i = 0; i < con->size; i++)
{
printf("%-10s%-10s%-10d%-10s%-10s\n",
con->arr[i].name,
con->arr[i].gender,
con->arr[i].age,
con->arr[i].tel,
con->arr[i].addr);
}
}
//添加联系人
void ConAdd(Con* con)
{
person psi;
printf("请输入添加的联系人姓名:\n");
scanf("%s", psi.name);
printf("请输入添加的联系人性别:\n");
scanf("%s", psi.gender);
printf("请输入添加的联系人年龄:\n");
scanf("%d", &psi.age);
printf("请输入添加的联系人电话:\n");
scanf("%s", psi.tel);
printf("请输入添加的联系人住址:\n");
scanf("%s", psi.addr);
SLAddEnd(con, psi);
printf("添加成功\n");
}
//按照名字查找
int Find_name(Con* con, char* name)
{
for (int i = 0; i < con->size; i++)
{
if (strcmp(con->arr[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//删除联系人
void ConDel(Con* con)
{
char name[NAME_MAX];
printf("请输入删除的联系人姓名:\n");
scanf("%s", name);
int find = Find_name(con, name);
if (find < 0)
{
printf("需要删除的联系人不存在\n");
return;
}
SLDeleve(con, find);
printf("删除成功\n");
}
//修改联系人
void Conrev(Con* con)
{
char name[NAME_MAX];
printf("请输入需要修改的联系人姓名:\n");
scanf("%s", name);
int find = Find_name(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");
}
//查找联系人
void ConFind(Con* con)
{
char name[NAME_MAX];
printf("请输入查找的联系人姓名:\n");
scanf("%s", name);
int find = Find_name(con, name);
if (find < 0)
{
printf("查找的联系人不存在\n");
return;
}
printf("查找成功\n");
printf("%-10s%-10s%-10s%-10s%-10s\n", "姓名", "性别", "年龄", "电话", "住址");
printf("%-10s%-10s%-10d%-10s%-10s\n",
con->arr[find].name,
con->arr[find].gender,
con->arr[find].age,
con->arr[find].tel,
con->arr[find].addr);
}
Coontact.h
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#define NAME_MAX 20
#define GENDER_MAX 20
#define TEL_MAX 20
#define ADDR_MAX 50
typedef struct personinfo //联系人信息
{
char name[NAME_MAX];//姓名
char gender[GENDER_MAX];//性别
int age; //年龄
char tel[TEL_MAX];//电话
char addr[ADDR_MAX];//住址
}person;
typedef struct SeqList Con;//重命名顺序表
//通讯录初始化
void ConInit(Con* con);
//通讯录销毁
void ConDesTroy(Con* con);
//查看通讯录
void ConShow(Con* con);
//添加联系人
void ConAdd(Con* con);
//修改联系人
void Conrev(Con* con);
//删除联系人
void ConDel(Con* con);
//查找联系人
void ConFind(Con* con);
感谢各位大佬支持并指出问题,
如果本篇内容对你有帮助,可以一键三连支持以下,感谢支持!!!