先分析思路——无思路必看!
:
- 定义
PeoInfo
结构体,里面存储的是人的信息,比如姓名,性别,年龄等,之后需要将其定义为数组,因为要存储多个信息。 - 定义整型变量
sz
,用来记录存储的人信息的个数,因为需要知道到底储存了多少个人的信息。 为了方便操作,将上面两个变量进行封装(因为进行操作的同时,可能需要改变
sz
的值(比如增加,删除),如果不封装,每次传参需要传两个),将它们封装到一个新的结构体Contact
中,Contact
的成员分为:PeoInfo
类型的数组data
int
类型的变量sz
数组
data
用来存储信息,sz
用来记录个数。定义完成之后,在函数中创建
Contact
结构体变量(假设创建的变量为contact
),等需要操作时,只需要将contact
的地址传入函数中,就可以对它的值进行修改。而对于通讯录的增删查改等操作,其实操作的是
contact
结构体的成员,也就是数组data
。所以整体的操作思路可以想象成对数组的操作。- 增加信息: 如果数组没有满,给数组下标为sz的成员赋值,赋值成功后
sz++
,如果满,提示已满并返回。 - 删除信息:在数组中查找Name值与输入值相同的人,如果找到,将后面的人的信息依次向前挪动一位,成功后
sz--
。如果未找到,提示未找到,并返回。 - 查找信息:在数组中查找
Name
值与输入值相同的人,如果找到,输出信息。如果未找到,提示未找到,并返回。 - 修改信息:在数组中查找
Name
值与输入值相同的人,如果找到,进行修改。如果未找到,提示未找到,并返回。 - 输出信息:输出所有有效信息,个数为
sz
。 - 排序 :按照首字母由小到大排序(strcmp实现)。
- 清空 :数组初始化,
sz
赋值为0。 - 退出 :退出程序。
查找信息可以根据不同的变量查找,即根据
Sex
,Age
等,只需要添加不同的操作即可,此处为按Name
查找,其他函数也是按照Name
查找。数组的大小是固定的,预编译定义的大小为1000。增加信息和删除信息,除了将人的信息存储进数组以外,还需要改变sz
的值。- 增加信息: 如果数组没有满,给数组下标为sz的成员赋值,赋值成功后
通过上面的分析,就可以用下面的定义(从代码中摘取出的部分,只用来表示上面思路的具体实现)来实现结构体的创建:
#define NAME_MAX 20 //姓名字符串最大值
#define SEX_MAX 5 //性别字符串最大值
#define TELE_MAX 12 //电话字符串最大值
#define ADDR_MAX 25 //地址字符串最大值
#define CAPACITY_MAX 1000 //初始化时空间默认值
typedef struct PeoInfo //联系人信息
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
}PeoInfo;
typedef struct Contact //通讯录信息
{
PeoInfo data[CAPACITY_MAX];
int sz;
}Contact, *pContact;
函数部分就是正常的增删查改、排序、输出、清空。只需要想清楚操作的是data
数组,而数组中有效信息的个数为sz
即可,下面附上函数部分在头文件中的声明:
void Choose_menu(); //打印选择菜单
void Initialize_Contact(pContact pcon); //初始化通讯录
void Choose(); //选择功能
void Add_Peoinfo(pContact pcon); //添加人信息
void Delete_Peoinfo(pContact pcon); //删除人信息
void Search_Peoinfo(const pContact pcon); //查找人的信息
void Modify_Peoinfo(pContact pcon); //修改人的信息
void Show_Peoinfo(const pContact pcon); //输出人的信息
void Sort_Peoinfo(pContact pcon); //排序人的信息