顺序表的应用
1.基于动态顺序表实现通讯录:
C语言基础要求:
结构体,动态内存管理,顺序表,文件操作
1.功能要求
1)至少能够存储100个人的通讯信息
2)能够保存用户信息:名字、性别、年龄、电话、地址等
3)增加联系人信息
4)删除指定联系人
5)查找制定联系人
6)修改指定联系人
7)显示联系人信息
2、代码实现
【思考1】用静态顺序表和动态顺序表分别如何实现
思考2】如何保证程序结束后,历史通讯录信息不会丢失
下面的两传代码包括讲解与实现细节多多
contact.h
#pragma once
//顺序表一开始存储的是内置类型,现在我要存储的是自定义类型,而这个自定义类型就是联系人数据
//定义联系人数据结构
//包括:姓名 性别 年龄 电话 地址#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100
//前置声明
//给顺序表改个名字叫做通讯录,但是为什么不是typedef SL contact;呢?因为这里我们没有包含顺序表的头文件,我就找不到SL,所以这里我们就要用到结构体的初始名字
typedef struct SeqList contact;
//用户数据
typedef struct personinfo//因为我每次使用这个联系人结构体都要用struct personinfo,这样就特别的麻烦,所以我们写个名字就可以
{char name[NAME_MAX];char gender[SEX_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];}peoInfo;//因为结构体要存到顺序表中,所以我们要对顺序表里存储的数据类型做替换
//所以SeqList.h这个文件里的typedef int SLDataType;要替换成typedef peoInfo SLDataType;//要用到顺序表相关方法,对通讯录的操作实际上就是对顺序表进行操作
// 讯录相关的方法 //初始化通讯录
void InitContact(contact* con);
//添加通讯录数据
void AddContact(contact* con);
//删除通讯录数据
void DelContact(contact* con);
//展示通讯录数据
void ShowContact(contact* con);
//查找通讯录数据
void FindContact(contact* con);
//修改通讯录数据
void ModifyContact(contact* con);
//销毁通讯录数据
void DestroyContact(contact* con);
contact.c
#include"contact.h"
#include"SeqList.h"
//通讯录的初始化
void InitContact(contact* con)
{//通讯录的初始化实际上进行的是顺序表的初始化。//而且顺序表的初始化已经实现好了,我们就直接调用就可以了SLInit(con);
}
//顺序表的销毁
void DestroyContact(contact* con)
{SLDestroy(con);//跟上面的是同理的
}
//通讯录添加数据
void AddContact(contact* con)
{
//我们要添加数据,获取用户输入的内容:姓名+性别+年龄+电话+地址 我们要思考一个问题?这些姓名性别电话年龄地址要保存到哪里呢?//因为我们前面定义好联系人数据结构体了,就是这个:/*typedef struct personinfo{char name[NAME_MAX];char sex[SEX_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];}peoInfo;*///接下来我们就直接用这个结构体就行了:peoInfo info;//现在这个结构体里面没有任何数据我获取到的任何数据都需要往这个结构体里面去插入printf("请输入要添加的联系人姓名:\n");scanf("%s",info.name);printf("请输入要添加的联系人性别:\n");scanf("%s", info.gender);printf("请输入要添加的联系年龄:\n");//为什么单单这个年龄要加取地址符号?因为name gender tel addr都是数组名他们本身就是地址scanf("%s", &info.age);printf("请输入要添加的联系人电话:\n");scanf("%s", info.tel);printf("请输入要添加的联系人地址:\n");scanf("%s", info.addr);//接下来我们要往通讯录中添加联系人数据,通讯录就是顺序表,我们有头插尾插指定位置插入数据,这几个都可以进行,这里我们选用尾插void SLPushBack(con, info);//尾插有两个参数一个是通讯录,一个就是我们要插入的数据,这里的数据类型是SLDataType x,是 peoInfo结构体类型,//刚好我们这里定义了结构体我们把数据都保存到了结构体里面,所以这第二个参数我们就写入info就行了。//void SLPushBack(con, info);叫做顺序表中已有方法的复用
}int FindByName(contact* con, char name[]);//根据姓名查找,我们要往通讯录里查,这里提供一个通讯录 contact* con
{
//下面我就用for循环来进行遍历for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].name, name))//这里的name是字符串我们就要用strcmp进行比较大小{//找到了return i;}}//没有找到return -1;
}
void DelContact(contact* con)
{//要删除的数据必须要存在才能执行删除操作,那要看这个数据在不在就要进行查找,那我们就在姓名进行查找,我们把查找写到上面char name[NAME_MAX];printf("请输入你要查找的联系人的数据:\n");scanf("%s", name);//接下来我要调用上面的函数查找联系人在不在int find = FindByName(con, name);if (find < 0){printf("要删除的联系人数据不存在!\n");return ;}//要删除的联系人数据存在//接下来我们就要删除联系人数据,有头删尾删指定数据删除,我们要用的就是指定数据的删除SLErase(con, find);printf("删除成功\n");
}
//展示通讯录数据
void ShowContact(contact* con)
{//表头:姓名 性别 年龄 电话 地址printf("%s %s %s %s %s\n", "姓名","性别","年龄","电话""地址");//遍历通讯录,按照格式打印每个联系人数据for (int i = 0; i < con->size; i++){printf("%3s %3s %3d %3s %3s\n", con->arr[i].name, con->arr[i].gender, con->arr[i].age, con->arr[i].tel, con->arr[i].addr);}
}
//通讯录的修改
void ModifyContact(contact* con)
{void ModifyContact(contact * con) {char name[NAME_MAX];printf("请输入要修改的用户姓名:\n");scanf("%s", name);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].sgender);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 FindContact(contact* con)
{//通讯录的查找应该是这样的我打出11这个姓名要把它的所有信息都打印出来。
// 11 11 11 11 11char name[NAME_MAX]int find = FindByName(con, name);if (find < 0){printf("要删除的联系人数据不存在!\n");return;}//我们查找找出来的话,是按照这个样子打印的//姓名 性别 年龄 电话 地址//11 11 11 11 11
//所以我们要把上面展示数据的代码拿下来printf("%s %s %s %s %s\n", "姓名","性别","年龄","电话""地址");printf("%3s %3s %3d %3s %3s\n", con->arr[find].name, con->arr[find].gender, con->arr[find].age, con->arr[find].tel,con->arr[find].addr);
}