前言:上篇文章我们讲解的顺序表以及顺序表的具体实现过程,那么我们的顺序表在实际应用中又有什么作用呢?今天我们就基于顺序表来实现一下通讯录。
目录
一.准备工作
二.通讯录的实现
1.通讯录的初始化
2.插入联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.通讯录引入文件操作
7.通讯录销毁
三.通讯录测试代码
四.所有实现代码
五.结言
一.准备工作
在准备通讯录的实现前我们要先清楚我们的通讯录要实现什么功能。
1.首先我们的添加以及删除联系人是必不可少的.
2.还有对已有联系人的查找,以及修改.
3.当我们储存完之后还要看我们的通讯录存储的信息,也就是打印通讯录.
4.我们还可以将每次输入的信息存入文件中每次打开通讯录时再次打印。
(注:通讯录的一部分代码是直接引用的顺序表代码如有看不懂的可以去上一篇文章中查看)
二.通讯录的实现
1.通讯录的初始化
void ConInit(SL* sl)
{
SLinit(&sl);
}
这边的代码我们就只需要引用上一篇顺序表的初始化代码就可以了.
2.插入联系人
void ConPush(SL* sl)
{
assert(sl);
Con con;
printf("请输入姓名>|");
scanf("%s", con.name);
printf("\n");
printf("请输入性别>|");
scanf("%s", con.sex);
printf("\n");
printf("请输入电话>|");
scanf("%s", con.tele);
printf("\n");
printf("请输入年龄>|");
scanf("%d",&( con.age));
printf("\n");
SLbackpush(sl, con);
}
在插入联系人这以过程中我们把sl->a的类型改为我们创建的联系人信息
#define NAME 20
#define AREA 50
#define SEX 10
#define TELE 15
typedef struct Con {
char name[NAME];
int age;
//char area[AREA];
char sex[SEX];
int tele[TELE];
}Con;
typedef Con SLType;
typedef struct SL
{
SLType* a;
int size;
int capacity;
}SL;
这样我们在添加数据时我们可以直接将Con传入我们顺序表的尾插代码中。
3.删除联系人
在写删除代码时我们需要一个需要确定删除哪一个联系人,并且后面的修改查找也会用到相应的操作,所以我们将通过名字寻找包装成一个函数,一边后续代码的书写。
int ConByname(SL* sl, char* name)
{
assert(sl);
for (int i = 0; i < sl->size; i++)
{
if (strcmp(sl->a[i].name,name)==0)
{
return i;
}
}
return 0;
}
接下来我们写联系人删除的操作代码:
void Conpop(SL* sl)
{
assert(sl);
printf("请输入要删除人的姓名\n");
char name[10] = { 0 };
scanf("%s", name);
int ret = ConByname(sl, name);
if (ret >= 0)
{
SLrandompop(sl, ret);
printf("删除成功!\n");
}
else
{
printf("删除失败,没有此联系人\n");
}
}
是不是也没有什么难的。
4.查找联系人
同样我们也是需要我们的通过名称寻找联系人,具体代码如下:
void ConFind(SL* sl)
{
assert(sl);
printf("请输入要查找人的姓名\n");
char name[10];
scanf("%s", name);
int i = ConByname(sl, name);
if (i >= 0)
{
printf("%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
}
else
{
printf("没有找到此联系人\n");
}
}
5.修改联系人
void ConModify(SL* sl)
{
assert(sl);
printf("请输入要修改人的姓名\n");
char name[10];
scanf("%s", name);
int i = ConByname(sl, name);
if (i >= 0)
{
printf("请输入姓名>|");
scanf("%s", sl->a[i].name);
printf("\n");
printf("请输入性别>|");
scanf("%s", sl->a[i].sex);
printf("\n");
printf("请输入电话>|");
scanf("%s", sl->a[i].tele);
printf("\n");
printf("请输入年龄>|");
scanf("%d", &(sl->a[i].age));
printf("\n");
printf("修改成功\n");
}
else
{
printf("修改失败没有此联系人\n");
}
}
也跟上面的代码大同小异。
6.通讯录引入文件操作
为了增加我们代码的实用性,我们引用我们前几篇博客说到的文件操作,将每次存入的联系人存放到文件当中。
具体代码如下:
void ConPutFile(SL* sl)
{
assert(sl);
FILE* pf = fopen("data.txt", "w");
if (pf == NULL)
{
perror(fopen);
return;
}
for (int i = 0; i < sl->size; i++)
{
fprintf(pf,"%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
}
}
void ConPushFile(SL* sl)
{
assert(sl);
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror(fopen);
return;
}
for (int i = 0; i < sl->size; i++)
{
fscanf(pf,"%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
}
}
7.通讯录销毁
void ConDestory(SL* sl)
{
SLdestory(&sl);
}
三.通讯录测试代码
void menu()
{
printf("********************************\n");
printf("***0.退出通讯录 1.增加联系人***\n");
printf("***2.删除联系人 3.查看通讯录***\n");
printf("***4.查找联系人 5.修改联系人***\n");
printf("********************************\n");
}
int main()
{
int input = 0;
SL con = { 0 };
ConInit(&con);
ConPushFile(&con);
do {
menu();
printf("请选择要进行的操作\n");
scanf("%d", &input);
switch (input)
{
case 1:
ConPush(&con);
break;
case 2:
Conpop(&con);
break;
case 3:
ConPrint(&con);
break;
case 4:
ConFind(&con);
break;
case 5:
ConModify(&con);
break;
case 0:
printf("推出成功\n");
break;
default:
printf("输入错误请重新输入\n");
break;
}
} while (input);
ConPutFile(&con);
//ConDestory(&con);
return 0;
}
我们采用do while(ture)循环来实现,这样我们的代码就大大增加的实用性。
四.所有实现代码
这里不再写关于顺序表的代码操作,如有需要请看上一篇博客。
Con.h
#pragma once
#define NAME 20
#define AREA 50
#define SEX 10
#define TELE 15
typedef struct Con {
char name[NAME];
int age;
//char area[AREA];
char sex[SEX];
int tele[TELE];
}Con;
typedef struct SL SL;
void ConInit(SL* sl);
void ConPushFile(SL* sl);
void ConPush(SL* sl);
void Conpop(SL* sl);
void ConPrint(SL* sl);
void ConFind(SL* sl);
void ConModify(SL* sl);
void ConPutFile(SL* sl);
void ConDestory(SL* sl);
Con.c
#include"SL.h"
void ConInit(SL* sl)
{
SLinit(&sl);
}
void ConPushFile(SL* sl)
{
assert(sl);
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror(fopen);
return;
}
for (int i = 0; i < sl->size; i++)
{
fscanf(pf,"%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
}
}
void ConPush(SL* sl)
{
assert(sl);
Con con;
printf("请输入姓名>|");
scanf("%s", con.name);
printf("\n");
printf("请输入性别>|");
scanf("%s", con.sex);
printf("\n");
printf("请输入电话>|");
scanf("%s", con.tele);
printf("\n");
printf("请输入年龄>|");
scanf("%d",&( con.age));
printf("\n");
SLbackpush(sl, con);
}
void ConPrint(SL* sl)
{
assert(sl);
printf("姓名 性别 年龄 电话 \n");
for (int i = 0; i < sl->size; i++)
{
printf("%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
}
}
int ConByname(SL* sl, char* name)
{
assert(sl);
for (int i = 0; i < sl->size; i++)
{
if (strcmp(sl->a[i].name,name)==0)
{
return i;
}
}
return 0;
}
void Conpop(SL* sl)
{
assert(sl);
printf("请输入要删除人的姓名\n");
char name[10] = { 0 };
scanf("%s", name);
int ret = ConByname(sl, name);
if (ret >= 0)
{
SLrandompop(sl, ret);
printf("删除成功!\n");
}
else
{
printf("删除失败,没有此联系人\n");
}
}
void ConFind(SL* sl)
{
assert(sl);
printf("请输入要查找人的姓名\n");
char name[10];
scanf("%s", name);
int i = ConByname(sl, name);
if (i >= 0)
{
printf("%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
}
else
{
printf("没有找到此联系人\n");
}
}
void ConModify(SL* sl)
{
assert(sl);
printf("请输入要修改人的姓名\n");
char name[10];
scanf("%s", name);
int i = ConByname(sl, name);
if (i >= 0)
{
printf("请输入姓名>|");
scanf("%s", sl->a[i].name);
printf("\n");
printf("请输入性别>|");
scanf("%s", sl->a[i].sex);
printf("\n");
printf("请输入电话>|");
scanf("%s", sl->a[i].tele);
printf("\n");
printf("请输入年龄>|");
scanf("%d", &(sl->a[i].age));
printf("\n");
printf("修改成功\n");
}
else
{
printf("修改失败没有此联系人\n");
}
}
void ConPutFile(SL* sl)
{
assert(sl);
FILE* pf = fopen("data.txt", "w");
if (pf == NULL)
{
perror(fopen);
return;
}
for (int i = 0; i < sl->size; i++)
{
fprintf(pf,"%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
}
}
void ConDestory(SL* sl)
{
SLdestory(&sl);
}
Contest.c
void menu()
{
printf("********************************\n");
printf("***0.退出通讯录 1.增加联系人***\n");
printf("***2.删除联系人 3.查看通讯录***\n");
printf("***4.查找联系人 5.修改联系人***\n");
printf("********************************\n");
}
int main()
{
int input = 0;
SL con = { 0 };
ConInit(&con);
ConPushFile(&con);
do {
menu();
printf("请选择要进行的操作\n");
scanf("%d", &input);
switch (input)
{
case 1:
ConPush(&con);
break;
case 2:
Conpop(&con);
break;
case 3:
ConPrint(&con);
break;
case 4:
ConFind(&con);
break;
case 5:
ConModify(&con);
break;
case 0:
printf("推出成功\n");
break;
default:
printf("输入错误请重新输入\n");
break;
}
} while (input);
ConPutFile(&con);
//ConDestory(&con);
return 0;
}
五.结言
好了关于顺序表以及顺序表的通讯录实现就到这里了,如果有哪里不足的欢迎大佬指出。
谢谢大家的支持!!!
喜欢的一键三连!!(看到一定会回的)
拜拜了!!!