目录
前言
此前我学习了顺序表的构建以及如何进行增删查改,这里是基于上述知识所创建的通讯录项目
一、项目概述
基于动态顺序表实现通讯录。
通讯录的基本功能要求有:
- 至少储存100个的通讯信息
- 信息中包括:姓名,性别,年龄,电话,地址
- 实现对联系人信息的增删查改和显示
二、项目实现
1.创建相应的文件
首先我们要创建包含通讯录实现函数的contact.c文件,以及对这些函数进行声明的.h文件
注意:源文件可以创建多个,定义不同模块的函数,但所有文件中只能有一个main函数,作为程序运行的入口!!!
原因如下:
1. **模块化设计**:促进代码组织、复用和管理。
2. **接口与实现分离**:.h头文件定义了模块的接口,即函数声明、类型定义、常量宏等,而.c文件则实现了这些接口背后的具体功能。提升封装性,简化外部使用。
3. **减少重复编译**:提高编译效率,避免代码冗余。
4. **编译效率提升**:加速构建过程,特别是在大型项目中。
5. **利于协作共享**:简化代码理解和团队合作。
2.实现对应功能
基本思路:其实通讯录就是顺序表,只不过是在顺序表中储存的变量类型是自定义的结构体类型,然后再给顺序表换了个名字叫通讯录,因此实现通讯的功能时,我们可以直接引用顺序表中的功能。为了能够在一个变量中同时储存多个数据,我们采用结构体变量
如下图所示,每个顺序表中的元素储存的都是一个结构体变量
-
联系人信息的创建
首先我们需要在contact.h文件中创建专门存储联系人信息的结构体变量,这里使用define定义变量是为了方便后续修改和使用数据
#pragma once
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADD_MAX 100
//定义联系人数据的结构
//姓名,性别,年龄,电话,地址
typedef struct personInfo {
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tele[TEL_MAX];
char add[ADD_MAX];
}peoinfo;//给联系人结构体重命名
注意:此时顺序表中存储的数据类型已经发生改变,要进行替换,此时我们直接利用重命名后的peoinfo需要包含"contact.h"的头文件,否则无法识别该类型
-
此外
为了使别人能够一眼看出我们项目的功能,此时我们要将contact.h中将顺序表的名字改成通讯录
即把顺序表的结构体的类型名改为contact
注意:因为头文件无法相互包含,所以在此处我们需要用到前置声明
//contact无法找到SL,但又因为头文件不能相互包含,所以使用前置声明
//给顺序表改个名字变成通讯录
typedef struct seqlist contact;
现在我们在contact.c文件中实现通讯录函数,并且在contact.h文件中进行函数的声明
-
通讯录的初始化和销毁
通讯录的初始化和销毁==顺序表的初始化和销毁
因为我们已经实现过了顺序表的初始化和销毁,因此我们直接拿来用即可
//初始化通讯录
void InitContact(contact* con)
{
//顺序表的初始化即为通讯录的初始化
SLInit(con);
};
//销毁通讯录数据
void DestroyContact(contact* con)
{
SLDestroy(con);
};
-
通讯录的查找和展示
基本思路:我们要用一个特定的信息进行查找,如姓名,电话,然后再遍历元素。下面以姓名为例
//查找联系人1
int Findcontact(contact* con, char* name)//选定用名字来进行查找
{
for (int i = 0; i < con->size; i++)
{
if (strcmp(con->arr[i].name, name) == 0)//注意strmp函数的两个参数都是字符型指针
{
return i;//找到了,返回下标
}
}
return -1;//没找到,返回无效数字
};
这时Findcontact的返回数据类型为int,是为了方便后期我们删除和展示联系人,一般不单独进行使用
展示联系人非常简单,我们只需要将所有的联系人遍历一遍,再将对应的数据打印出来即可
//展示通讯录数据
void ShowContact(contact* con)
{
//首先创建表头
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
for (int i = 0; i < con->size; i++)
{
//对录讯通中的元素一一打印
printf("%s %s %d %s %s\n", con->arr[i].name, con->arr[i].gender, con->arr[i].age, con->arr[i].tele, con->arr[i].add);
}
};
大多数时候我们查找联系人就是为了看联系人的具体信息因此我们可以直接写一个函数实现这两个功能:首先找到该联系人,然后对联系人的信息进行打印
//查找通讯录数据,同时将联系人的数据打印出来
void FindContact(contact* con)
{
char name[NAME_MAX];
//输入要查找的联系人姓名
printf("请输入要查找的联系人姓名\n");
scanf("%s", name);
int find = Findcontact(con, name);
if (find < 0)
printf("该联系人不存在!\n");
else
{//打印联系人的相关信息
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].tele, con->arr[find].add);
}
};
-
通讯录的插入和删除
基本思路:首先我们要向通讯录中输入联系人信息,然后再利用顺序表中的插入函数,将数据插入即可
//添加通讯录数据
void AddContact(contact* con)
{
//首先要获取用户输入的内容
peoinfo peo;//创建联系人变量
printf("请输入要添加的联系人姓名\n");
scanf("%s", peo.name);//数组名-首元素地址
printf("请输入要添加的联系人性别\n");
scanf("%s", peo.gender);
printf("请输入要添加的联系人年龄\n");
scanf("%d", &peo.age);
printf("请输入要添加的联系人电话\n");
scanf("%s", peo.tele);
printf("请输入要添加的联系人地址\n");
scanf("%s", peo.add);
SLPushback(con, peo);//将通讯录和结构体变量传参
//利用尾插函数void SLPushback(SL* ps, SQL x)
};
删除联系人首先我们需要,在录讯通中查找是否存在该联系人,我们可以通过姓名,电话这些关键信息来查找,如果存在我就将联系人删除,如果不存在就提示使用者不存在该联系人
//删除通讯录数据
void DelContact(contact* con)
{
//注意,要删除的数据必须存在,才能执行删除操作
char name[NAME_MAX] = { 0 };
//输入要查找的联系人姓名
printf("请输入要删除的联系人姓名\n");
scanf("%s", name);
int find = Findcontact(con,name);
if (find < 0)
printf("要删除的联系人不存在!\n");
else
{
//删除已知下标的联系人
SLErase(con, find);
//删除指定位置的数据
//void SLErase(SL* ps, int pos)
printf("删除成功!\n");
}
};
注意:此时我们已经知道了联系人的位置所以要利用指定位置删除数据的函数
- 通讯录数据的修改
基本思路:想要实现某个数据修改,首先我们得先找到,然后再重新输入新的数据
//修改通讯录数据
void ModifyContact(contact* con)
{
//要修改的联系人数据存在
char name[NAME_MAX] = { 0 };
//输入要查找的联系人姓名
printf("请输入要修改的联系人姓名\n");
scanf("%s", name);
int find = Findcontact(con, name);
if (find < 0)
printf("要修改的联系人不存在!\n");
else
{
//修改已知下标的联系人
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].tele);
printf("请输入新的地址:\n");
scanf("%s", con->arr[find].add);
printf("修改成功\n");
}
总结
综上就是对通讯录项目的具体实现,大家想要查看所有具体代码可以点击下方git文章链接