通讯录的实现(详解)

2026-01-31 20:58:32

通讯录的基本介绍: 记录一个人的基本信息,并且需要它可以实现增删查改等功能;

可以保存100个人的信息 人的信息:

1.添加联系人信息; 名字

2.删除联系人信息; 年龄

3.查找联系人信息; 性别

4.修改联系人信息; 电话

5.显示联系人信息; 地址

6.排序联系人信息;

0.退出程序

通讯录的实现过程: 建议:实现之前我们可以分成三个模块

test.c用于专门测试通讯录功能

contact.c用于实现通讯录具体功能

contact.h用于实现接口的声明

1.设计通讯录的目录代码语言:javascript复制void menu()

{

printf("******************************************\n");

printf("***** 1.add 2.del ****\n");

printf("***** 3.search 4.modify ****\n");

printf("***** 5.show 6.sort ****\n");

printf("***** 0. exit ****\n");

printf("******************************************\n");

}2.基础菜单的实现:代码语言:javascript复制#include

void menu()

{

printf("******************************************\n");

printf("***** 1.add 2.del ****\n");

printf("***** 3.search 4.modify ****\n");

printf("***** 5.show 6.sort ****\n");

printf("***** 0. exit ****\n");

printf("******************************************\n");

}

enum

{

EXIT,

ADD,

DEL,

SEARCH,

MODIFY,

SHOW,

SORT

};

int main()

{

int input = 0;

do

{

menu();

printf("请输入:>");

scanf("%d", &input);

switch (input)

{

case ADD:

break;

case DEL:

break;

case SEARCH:

break;

case MODIFY:

break;

case SHOW:

break;

case SORT:

break;

case EXIT:

printf("退出通讯录\n");

break;

default:

printf("选择错误,请重新选择\n");

break;

}

} while (input);

return 0;

}3.定义人的信息代码语言:javascript复制#define NAME_MAX 20

#define SEX_MAX 5

#define TELE_MAX 12

#define ADDR_MAX 30

//定义人的信息

typedef struct PeoInfo

{

char name[NAME_MAX];

int age;

char sex[SEX_MAX];

char tele[TELE_MAX];

char addr[ADDR_MAX];

}PeoInfo;4.定义通讯录的信息代码语言:javascript复制#define MAX 100

typedef struct Contact

{

PeoInfo data[MAX];//存放数据

int sz;//记录的时当前通讯录中存放的人的信息个数

}Contact;5.创建通讯录并且初始化通讯录的信息已经在contact.h定义好,我们需要在test.c创建并且给它初始化

代码语言:javascript复制void InitContact(Contact* con)

{

assert(con);

con->sz = 0;

memset(con->data, 0, sizeof(con->data));

} 现在已经全部初始化为0 如果不初始化将会是随机值

注:实现过程都是在contact.c中的文件实现

6.添加联系人的信息代码语言:javascript复制void ADDContact(Contact* con)

{

assert(con);

//判断一下通讯录是否满了

if (con->sz == MAX)

{

printf("通讯录已满,无法添加\n");

return ;

}

printf("请输入联系人名字\n");

scanf("%s", con->data->name);

printf("请输入联系人年龄\n");

scanf("%d", &(con->data->age));

printf("请输入联系人性别\n");

scanf("%s", con->data->sex);

printf("请输入联系人电话\n");

scanf("%s", con->data->tele);

printf("请输入联系人地址\n");

scanf("%s", con->data->addr);

con->sz++;

printf("添加完成\n");

}7.显示通讯录的信息既然已经完成了添加联系人的信息了,我们可以显示一下到底输入了什么

代码语言:javascript复制void SHOWContact(Contact* con)

{

assert(con);

if (con->sz == 0)

{

printf("通讯录无内容\n");

return;

}

printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");

int i;

for (i = 0; i < con->sz; i++)

{

printf("%-20s%-5d%-5s%-12s%-30s\n",con->data[i].name,

con->data[i].age,

con->data[i].sex,

con->data[i].tele,

con->data[i].addr);

}

}8.删除联系人的信息代码语言:javascript复制int Fing_by_name(Contact* con, char* name)

{

assert(con);

int i;

for (i = 0; i < con->sz; i++)

{

if (strcmp(con->data[i].name, name) == 0)

{

return i;

}

}

return -1;

}

void DELContact(Contact* con)

{

char name[NAME_MAX];

assert(con);

if (con->sz == 0)

{

printf("通讯录为空,无法删除\n");

return ;

}

printf("请输入你想删除联系人的名字:\n");

scanf("%s", name);

// 查找通讯录里有没有该名字

int ret=Fing_by_name(con, name);

if (ret == -1)

{

printf("要删除的人不存在\n");

return ;

}

//否则返回他的下标

//思路: 因为要删除这一行信息 所以直接让后面的信息往前挪一个信息即可

int i;

for (i = ret; i < con->sz - 1; i++)

{

con->data[i] = con->data[i + 1];

}

con->sz--;

printf("删除成功\n");

}不懂的可以看里面的注释,这个先要写一个查找函数,在删除

9.查找联系人的信息代码语言:javascript复制void SEARCHContact(Contact* con)

{

char name[NAME_MAX];

assert(con);

if (con->sz == 0)

{

printf("通讯录为空,无法查找\n");

return;

}

printf("请输入你想查找联系人的名字:\n");

scanf("%s", name);

int ret = Fing_by_name(con, name);

if (ret == -1)

{

printf("要查找的人不存在\n");

return;

}

printf("%-20s%-5d%-5s%-12s%-30s\n", con->data[ret].name,

con->data[ret].age,

con->data[ret].sex,

con->data[ret].tele,

con->data[ret].addr);

}思路很简单了 ,先查找出来 再打印出来

10.修改联系人的信息代码语言:javascript复制void MODIFYContact(Contact* con)

{

char name[NAME_MAX];

assert(con);

if (con->sz == 0)

{

printf("通讯录为空,无法修改\n");

return;

}

printf("请输入你想修改联系人的名字:\n");

scanf("%s", name);

int ret = Fing_by_name(con, name);

if (ret == -1)

{

printf("要修改的人不存在\n");

return;

}

printf("请输入联系人名字:");

scanf("%s", con->data[ret].name);

printf("请输入联系人年龄:");

scanf("%d", &(con->data[ret].age));

printf("请输入联系人性别:");

scanf("%s", con->data[ret].sex);

printf("请输入联系人电话:");

scanf("%s", con->data[ret].tele);

printf("请输入联系人地址:");

scanf("%s", con->data[ret].addr);

printf("修改完成\n");

}先查找到改信息 在重新输入

11.排序联系人的信息—按名字排序代码语言:javascript复制int cmp_by_name(const void* e1, const void* e2)

{

return strcmp( ((PeoInfo*)e1)->name , ((PeoInfo*)e2)->name);

}

void SORTContact(Contact* con)

{

assert(con);

if (con->sz == 0)

{

printf("通讯录为空,无法排序\n");

return;

}

qsort(con->data, con->sz, sizeof(con->data[0]), cmp_by_name);

printf("排序完成\n");

} 这里要运用的qosrt函数,不会的可以看我之前的文章有介绍,很好实现的

完整代码展现:test.c:代码语言:javascript复制#define _CRT_SECURE_NO_WARNINGS 1

#include

#include "contact.h"

void menu()

{

printf("******************************************\n");

printf("***** 1.add 2.del ****\n");

printf("***** 3.search 4.modify ****\n");

printf("***** 5.show 6.sort ****\n");

printf("***** 0. exit ****\n");

printf("******************************************\n");

}

enum

{

EXIT,

ADD,

DEL,

SEARCH,

MODIFY,

SHOW,

SORT

};

int main()

{

int input = 0;

//创建通讯录

Contact con;

//初始化通讯录

InitContact(&con);

do

{

menu();

printf("请输入:>");

scanf("%d", &input);

switch (input)

{

case ADD:

ADDContact(&con);

break;

case DEL:

DELContact(&con);

break;

case SEARCH:

SEARCHContact(&con);

break;

case MODIFY:

MODIFYContact(&con);

break;

case SHOW:

SHOWContact(&con);

break;

case SORT:

SORTContact(&con);

break;

case EXIT:

printf("退出通讯录\n");

break;

default:

printf("选择错误,请重新选择\n");

break;

}

} while (input);

return 0;

}contact.c:代码语言:javascript复制#include "contact.h"

void InitContact(Contact* con)

{

assert(con);

con->sz = 0;

memset(con->data, 0, sizeof(con->data));

}

void ADDContact(Contact* con)

{

assert(con);

//判断一下通讯录是否满了

if (con->sz == MAX)

{

printf("通讯录已满,无法添加\n");

return ;

}

printf("请输入联系人名字:");

scanf("%s", con->data[con->sz].name);

printf("请输入联系人年龄:");

scanf("%d", &(con->data[con->sz].age));

printf("请输入联系人性别:");

scanf("%s", con->data[con->sz].sex);

printf("请输入联系人电话:");

scanf("%s", con->data[con->sz].tele);

printf("请输入联系人地址:");

scanf("%s", con->data[con->sz].addr);

con->sz++;

printf("添加完成\n");

}

void SHOWContact(Contact* con)

{

assert(con);

if (con->sz == 0)

{

printf("通讯录无内容\n");

return;

}

printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");

int i;

for (i = 0; i < con->sz; i++)

{

printf("%-20s%-5d%-5s%-12s%-30s\n",con->data[i].name,

con->data[i].age,

con->data[i].sex,

con->data[i].tele,

con->data[i].addr);

}

}

int Fing_by_name(Contact* con, char* name)

{

assert(con);

int i;

for (i = 0; i < con->sz; i++)

{

if (strcmp(con->data[i].name, name) == 0)

{

return i;

}

}

return -1;

}

void DELContact(Contact* con)

{

char name[NAME_MAX];

assert(con);

if (con->sz == 0)

{

printf("通讯录为空,无法删除\n");

return ;

}

printf("请输入你想删除联系人的名字:\n");

scanf("%s", name);

// 查找通讯录里有没有该名字

int ret=Fing_by_name(con, name);

if (ret == -1)

{

printf("要删除的人不存在\n");

return ;

}

//否则返回他的下标

//思路: 因为要删除这一行信息 所以直接让后面的信息往前挪一个信息即可

int i;

for (i = ret; i < con->sz - 1; i++)

{

con->data[i] = con->data[i + 1];

}

con->sz--;

printf("删除成功\n");

}

void SEARCHContact(Contact* con)

{

char name[NAME_MAX];

assert(con);

if (con->sz == 0)

{

printf("通讯录为空,无法查找\n");

return;

}

printf("请输入你想查找联系人的名字:\n");

scanf("%s", name);

int ret = Fing_by_name(con, name);

if (ret == -1)

{

printf("要查找的人不存在\n");

return;

}

printf("%-20s%-5d%-5s%-12s%-30s\n", con->data[ret].name,

con->data[ret].age,

con->data[ret].sex,

con->data[ret].tele,

con->data[ret].addr);

printf("查找完成");

}

void MODIFYContact(Contact* con)

{

char name[NAME_MAX];

assert(con);

if (con->sz == 0)

{

printf("通讯录为空,无法修改\n");

return;

}

printf("请输入你想修改联系人的名字:\n");

scanf("%s", name);

int ret = Fing_by_name(con, name);

if (ret == -1)

{

printf("要修改的人不存在\n");

return;

}

printf("请输入联系人名字:");

scanf("%s", con->data[ret].name);

printf("请输入联系人年龄:");

scanf("%d", &(con->data[ret].age));

printf("请输入联系人性别:");

scanf("%s", con->data[ret].sex);

printf("请输入联系人电话:");

scanf("%s", con->data[ret].tele);

printf("请输入联系人地址:");

scanf("%s", con->data[ret].addr);

printf("修改完成\n");

}

int cmp_by_name(const void* e1, const void* e2)

{

return strcmp( ((PeoInfo*)e1)->name , ((PeoInfo*)e2)->name);

}

void SORTContact(Contact* con)

{

assert(con);

if (con->sz == 0)

{

printf("通讯录为空,无法排序\n");

return;

}

qsort(con->data, con->sz, sizeof(con->data[0]), cmp_by_name);

printf("排序完成\n");

}contact.h:代码语言:javascript复制#define _CRT_SECURE_NO_WARNINGS 1

#include

#include

#include

#include

#define NAME_MAX 20

#define SEX_MAX 5

#define TELE_MAX 12

#define ADDR_MAX 30

#define MAX 100

//定义人的信息

typedef struct PeoInfo

{

char name[NAME_MAX];

int age;

char sex[SEX_MAX];

char tele[TELE_MAX];

char addr[ADDR_MAX];

}PeoInfo;

typedef struct Contact

{

PeoInfo data[MAX];//存放数据

int sz;//记录的时当前通讯录中存放的人的信息个数

}Contact;

//初始化通讯录

void InitContact(Contact* con);

//添加联系人的信息

void ADDContact(Contact* con);

//显示通讯录的信息

void SHOWContact(Contact* con);

//删除联系人的信息

void DELContact(Contact* con);

//查找联系人的信息

void SEARCHContact(Contact* con);

//修改联系人的信息

void MODIFYContact(Contact* con);

//排序联系人的信息-按名字

void SORTContact(Contact* con);结语:首先非常感谢大家的观看,这只是一个初步的通讯录,它还可以进阶实现

这个通讯录还存在很多缺陷:

1.它不能保存完成,一旦退出就消失了

2.它至少固定的大小,我们只开创了100个联系人,万一少于联系人,这个就浪费了很多的空间

所以下次我们会使用动态内存管理,可以自由开辟内存,就不会有浪费或不够。