前言:
通过对数据结构--顺序表的学习,了解了顺序表的增加数据,删除数据等功能;我们就可以基于顺序表来实现通讯录,接下来就一起来实现通讯录。
首先我们需要存储通讯录中联系人信息,这里创建一个结构体,
存储联系人姓名、性别、年龄、电话、住址等信息
#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);
感谢各位大佬支持并指出问题,
如果本篇内容对你有帮助,可以一键三连支持以下,感谢支持!!!