基于上节讲解的顺序表,这里我们将其应用实现通讯录项目
http://t.csdnimg.cn/FZQjN
结构体、动态内存管理、顺序表
这里与之前扫雷游戏的实现类似,就是printf函数的打印
//通讯录菜单
void menu()
{
printf("****************通讯录******************\n");
printf("*******1.添加联系人 2.删除联系人*******\n");
printf("*******3.修改联系人 4.查找联系人*******\n");
printf("*******5.查看联系人 0. 退 出 **********\n");
printf("****************************************\n");
}
int main()
{
int op = -1;
//创建通讯录结构对象
Contact con;
ContactInit(&con);
do
{
menu();
printf("请选择你的操作:\n");
scanf("%d", &op);
switch (op)
{
case 1:
//添加联系人
ContactAdd(&con);
break;
case 2:
//删除联系人
ContactDel(&con);
break;
case 3:
//修改联系人
ContactModify(&con);
break;
case 4:
//查找联系人
ContactFind(&con);
break;
case 5:
//查看通讯录
ContactShow(&con);
break;
case 0:
//退出
printf("通讯录退出中\n");
break;
default:
break;
}
} while (op != 0);
//销毁通讯录
ContactDesTroy(&con);
return 0;
}
第一个是每个用户的个人信息,包括名字,年龄,性别,电话,地址
第二个将每个用户的信息存储构成通讯录
//通讯录数据类型
typedef struct PersonInfo
{
char name[NAME_MAX];
int age;
char gender[GENDER_MAX];
char tel[TEL_MAX];
char addr[ADDR_MAX];
}Info;
typedef struct SeqList
{
SLDataType* arr;//存储数据的底层结构
int capacity;//记录顺序表的空间大小
int size;//记录顺序表当前有效的数据个数
}SL;
通过宏定义,便于我们将来的修改值
#define NAME_MAX 100
#define GENDER_MAX 10
#define TEL_MAX 12
#define ADDR_MAX 100
这里应用的顺序表的初始化和销毁
//通讯录的初始化和销毁
void ContactInit(Contact* pcon)
{
SLInit(pcon);
}
void ContactDesTroy(Contact* pcon)
{
SLDestroy(pcon);
}
通过顺序表的后插,进行增加
void ContactAdd(Contact* pcon)
{
//创建联系人结构体变量
Info info;
printf("请输入联系人姓名:\n");
scanf("%s", info.name);
printf("请输入联系人年龄:\n");
scanf("%d", &info.age);
printf("请输入联系人性别:\n");
scanf("%s", info.gender);
printf("请输入联系人电话:\n");
scanf("%s", info.tel);
printf("请输入联系人地址:\n");
scanf("%s", info.addr);
//保存数据到通讯录(顺序表)
SLPushBack(pcon, info);//后插
}
删除不同于添加,需要先判断是否有该用户,这里我们通过遍历名字查找是否存在该用户
PS:也可以通过其他特征(如电话、地址),最好是唯一特征,这样才准确
int FindByName(Contact* pcon, char name[])
{
for (int i = 0; i < pcon->size; i++)
{
if (strcmp(pcon->arr[i].name, name) == 0)
{
//找到了
return i;
}
}
return -1;
}
void ContactDel(Contact* pcon)
{
//删除之前,一定要先查找
//找到了,可以删除
//找不到不能执行删除
printf("请输入要删除的联系人的姓名\n");
char name[NAME_MAX];
scanf("%s", name);
int FindIndex = FindByName(pcon, name);
if (FindIndex < 0)
{
printf("要删除的联系人不存在\n");
return;
}
//执行删除程序
SLErase(pcon, FindIndex);
printf("联系人删除成功!\n");
}
与删除一样,都需要判断是否存在该用户,这里直接调用上面的函数即可
void ContactModify(Contact* pcon)
{
//修改之前要先查找
//找到了,执行修改操作
//没有找到,不能执行修改操作
char name[NAME_MAX];
printf("请输入要修改的联系人姓名:\n");
scanf("%s", name);
int FindIndex = FindByName(pcon, name);
if (FindIndex < 0)
{
printf("要修改的联系人不存在\n");
return;
}
//找到了,执行修改程序
printf("请输入姓名:\n");
scanf("%s", pcon->arr[FindIndex].name);
printf("请输入年龄:\n");
scanf("%d", &pcon->arr[FindIndex].age);
printf("请输入性别:\n");
scanf("%s", pcon->arr[FindIndex].gender);
printf("请输入电话:\n");
scanf("%s", pcon->arr[FindIndex].tel);
printf("请输入地址:\n");
scanf("%s", pcon->arr[FindIndex].addr);
printf("联系人修改成功\n");
}
查找类似,如果找到即打印信息
void ContactFind(Contact* pcon)
{
char name[NAME_MAX];
printf("请输入要查找的用户名\n");
scanf("%s", name);
int FindIndex = FindByName(pcon, name);
if (FindIndex < 0)
{
printf("该联系人不存在\n");
return;
}
//找到了,打印下联系人信息
printf("%-10s %-10s %-5s %-12s %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-10s %-10s %-5d %-12s %-20s\n",
pcon->arr[FindIndex].name,
pcon->arr[FindIndex].gender,
pcon->arr[FindIndex].age,
pcon->arr[FindIndex].tel,
pcon->arr[FindIndex].addr
);
}
void ContactShow(Contact* pcon)
{
printf("%-10s %-10s %-5s %-12s %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
for (int i = 0; i < pcon->size; i++)
{
printf("%-10s %-10s %-5d %-12s %-20s\n",
pcon->arr[i].name,
pcon->arr[i].gender,
pcon->arr[i].age,
pcon->arr[i].tel,
pcon->arr[i].addr
);//这样写更美观
}
}
我们是否能够通过前面学过的文件操作来进行保存呢?使得信息不丢失
我们这里使用的动态顺序表来实现,我们是否可以用静态的实现呢?
除了姓名、性别、年龄、电话、地址等功能外,是否还可以增加其他的功能(职位,生日)?