学习了顺序表之后,我们也得知道它的实际用途吧!所以,我们今天来学习一下通讯录的实现。
typedef struct personInfo SLDataType;
contact.h
#define NAME_MAX 20 #define GENDER_MAX 20 #define GTEL_MAX 20 #define ADDR_MAX 100 #include"SeqList.h" //定义联系人数据结构 //姓名 性别 年龄 电话 地址 typedef struct PersonInfo { char[NAME_MAX]; gender[GENDER_MAX]; int age; char tel[TEL_MAX]; char addr[ADDR_MAX]; }peoInfo; //通讯录的初始化 typedef struct SeqList Contact;//改通讯录的名字,没有包含顺序表的头文件,所以需要写出完整的名字 void ContactInit(Contact*con); //通讯录的销毁 void ContactDestory(Contact*con); //往通讯录里添加数据 void ContactAdd(Contact*con); //通讯录的修改 void ContactModify(Contact*con); //通讯录的查找 void ContactFind(Contact*con); //通讯录的展示 void ContactShow(Contact*con); typedef int SLDataType; //通讯录增加删除数据
SeqList.h
#include"Contact.h"//把头文件加载进来 //typedef int SLDataType typedef peoInfo SLDataType {
contact.c
#include"Contact.h" //通讯录的初始化 void ContactInit(Contact* con) { //实际上要进行的是顺序表的初始化,顺序表的初始化实际上已经实现好了 SLInit(con); } void ContactDestroy(Contact* con) { SLDestroy(con); } //通讯录添加数据 void ContactAdd(contact* con) { peoInfo info; //获取用户输入的内容:姓名,性别,年龄,电话,地址 printf("请输入要添加的联系人姓名:\n”); scanf("%s",info.name); printf("请输入要添加的联系人性别:\n”); scanf("%s",info.gender); printf("请输入要添加的联系人年龄:\n”); scanf("%s",&info.age); printf("请输入要添加的联系人电话:\n”); scanf("%s",info.tel); printf("请输入要添加的联系人住址:\n”); scanf("%s",info.addr); //往通讯录中添加数据 SLPushBack(con,info);//尾插,顺序表中已有方法的复用 } //通讯录删除联系人 int FindByName(Contact*con,char name[]) { for(int i=0;i<con->size;i++) { if(0==strcmo(con->arr[i].name,name)) { //找到了 return i; } } //没有找到 return -1; } void ContactDel(Contact* con) { //要删除的文件必须存在,才能执行删除操作 //查找 int find=FindByName(con,name); if(find<0) { printf("要删除的联系人数据不存在!\n); return; } //要删除的联系人存在-->知道了要删除的联系人数据对应的下标 SLErase(con,find); printf("删除成功!\n"); } //展示通讯录数据 void ContactShow(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].nme, con->arr[i].gender, con->arr[i].age, con->arr[i].tel, con->arr[i].addr ); } } //通讯录的修改 void ContactModify(Contact*con) { //要修改的联系人数据存在 char name[NAME_MAX]; printf("请输入要修改的用户姓名:\n"); scanf("%s",nmae); 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("%s",con->arr[find].tel); printf("请输入新的地址:\n"); scanf("%s",con->arr[find].addr); printf("修改成功!\n)"; } //通讯录查找 void ContactFind(Contact* con) { //姓名 性别 年龄 电话 地址 //11 11 11 11 11 char name[NAME_Max]; printf("%s",name); int find=FindByName(con,name); if(find<0) { printf("要修改的联系人数据不存在!\n); return; } //手动调整格式 printf("%s %s %s %s %s\n","姓名","性别","年龄","电话","地址"); printf("%s %s %d %s %s\n", con->arr[find].nme, con->arr[find].gender, con->arr[find].age, con->arr[find].tel, con->arr[find].addr );
通讯录的测试方法
void ContactTest() { Contact con;//创建通讯录对象,实际上就是顺序表对象,等价于SL s1 ContactInit(&con); }
test.c
void ContactTest() { Contact con;//创建通讯录对象,实际上就是顺序表对象,等价于SL s1 ContactInit(&con); }
如何保证程序结束后,历史通讯录信息不会丢失:
void SaveContact(contact* con) { FILE* pf = fopen("contact.txt", "wb"); if (pf == NULL) { perror("fopen error!\n"); return; } //将通讯录数据写⼊⽂件 for (int i = 0; i < con->size; i++) { fwrite(con->a + i, sizeof(PeoInfo), 1, pf); } printf("通讯录数据保存成功!\n"); }