静态版本
动态版本
文件存储版本
文件:
test.c: 测试通讯录逻辑
Contact.c: 通讯录相关函数功能的实现
Contact.h: 关于通讯录相关的函数声明,符号声明,头文件包含
完整代码:可直接运行
详细步骤和解析均在代码注释里
test.c:
/*
通讯录-静态版本
通讯录中能够存放100(可修改长度)个人的信息
每个人的信息:
名字+性别+年龄+电话+地址
1. 增加联系人的信息
2. 删除指定人的信息
3. 修改指定人的信息
4. 查找指定人的信息
5. 排序通讯录的信息
6. 打印通讯录所有信息
0. 退出程序
*/
#include "Contact.h"
void Menu() //菜单
{
printf("********************************\n");
printf("***** 1.add 2.del *****\n");
printf("***** 3.modify 4.search *****\n");
printf("***** 5.sort 6.print *****\n");
printf("***** 0.exit *****\n");
printf("********************************\n");
}
enum Option //枚举
{
EXIT, //0
ADD, //1
DEL, //2
MODIFY, //3
SEARCH, //4
SORT, //5
PRINT //6
};
int main()
{
int input = 0;
Contact con; //创建结构体变量
InitContact(&con); //初始化结构体
do
{
Menu(); //菜单
printf("请选择:>");
scanf("%d", &input); //选择功能
switch (input)
{
case EXIT:
break;
case ADD:
AddContact(&con); //添加联系人
break;
case DEL:
DelContact(&con); //删除联系人
break;
case MODIFY:
ModifyContact(&con); //修改联系人
break;
case SEARCH:
SearchContact(&con); //查找联系人
break;
case SORT:
SortContact(&con); //联系人分类
break;
case PRINT:
PrintContact(&con); //打印通讯录全部信息
break;
default:
printf("非法操作,请重新选择\n");
break;
}
} while (input);
return 0;
}
Contact.c:
#include "Contact.h"
void InitContact(Contact* pc) //初始化结构体
{
pc->sz = 0;
memset(pc, 0, sizeof(pc->data));
}
void PrintContact(const Contact* pc) //打印通讯录全部信息
{
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
void AddContact(Contact* pc) //添加联系人
{
if (pc->sz >= MAX_PEO)
{
printf("通讯录已满,无法新增\n");
}
else
{
printf("请输入名字:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("联系人增加成功\n");
}
}
static int FindName(const Contact* pc) //查找名字 静态static 该函数只在本文件使用
{
char name[MAX_NAME] = { 0 };
printf("请输入联系人的名字:>");
scanf("%s", name);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void DelContact(Contact* pc) //删除联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除联系人成功\n");
}
void ModifyContact(Contact* pc) //修改联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
printf("请输入更改后的名字:>");
scanf("%s", pc->data[ret].name);
printf("请输入更改后的性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入更改后的年龄:>");
scanf("%d", &pc->data[ret].age);
printf("请输入更改后的电话:>");
scanf("%s", pc->data[ret].tele);
printf("请输入更改后的地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
void SearchContact(Contact* pc) //查找联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].tele,
pc->data[ret].addr);
}
static SortSex(const Contact* pc, char* s) //按照联系人的性别分类
{
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].sex, s) == 0)
{
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
}
void SortContact(Contact* pc) //联系人分类
{
int input;
printf("输入1打印出所有男性的信息,输入2打印出所有女性的信息:>");
scanf("%d", &input);
switch (input)
{
case 1:
SortSex(pc, "男");
break;
case 2:
SortSex(pc, "女");
break;
default:
printf("非法操作,已退出\n");
break;
}
}
Contact.h:
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#define MAX_NAME 20 //设置名字最大长度
#define MAX_SEX 10 //设置性别最大长度
#define MAX_TELE 12 //设置电话最大长度
#define MAX_ADDR 30 //设置地址最大长度
#define MAX_PEO 100 //设置通讯录人数最大长度
typedef struct PeoInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo; //结构体自定义类型名为PeoInfo
typedef struct Contact
{
PeoInfo data[MAX_PEO]; //存放添加进来的人的信息
int sz; //记录当前通讯录中有效信息的个数
}Contact; //结构体自定义类型名为Contact
void InitContact(Contact* pc); //初始化通讯录
void AddContact(Contact* pc); //添加联系人
void PrintContact(Contact* pc); //打印通讯录全部信息
void DelContact(Contact* pc); //删除联系人
void ModifyContact(Contact* pc); //修改联系人
void SearchContact(Contact* pc); //查找联系人
void SortContact(Contact* pc); //按照联系人的性别分类
完整代码:
//通讯录-静态版本
//通讯录中能够存放100(可修改长度)个人的信息
//每个人的信息:
//名字+性别+年龄+电话+地址
//1. 增加联系人的信息
//2. 删除指定人的信息
//3. 修改指定人的信息
//4. 查找指定人的信息
//5. 排序通讯录的信息
//6. 打印通讯录所有信息
//0. 退出程序
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#define MAX_NAME 20 //设置名字最大长度
#define MAX_SEX 10 //设置性别最大长度
#define MAX_TELE 12 //设置电话最大长度
#define MAX_ADDR 30 //设置地址最大长度
#define MAX_PEO 100 //设置通讯录人数最大长度
typedef struct PeoInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo; //结构体自定义类型名为PeoInfo
typedef struct Contact
{
PeoInfo data[MAX_PEO]; //存放添加进来的人的信息
int sz; //记录当前通讯录中有效信息的个数
}Contact; //结构体自定义类型名为Contact
void InitContact(Contact* pc); //初始化通讯录
void AddContact(Contact* pc); //添加联系人
void PrintContact(Contact* pc); //打印通讯录全部信息
void DelContact(Contact* pc); //删除联系人
void ModifyContact(Contact* pc); //更改联系人
void SearchContact(Contact* pc); //查找联系人
void SortContact(Contact* pc); //按照联系人的性别分类
void Menu() //菜单
{
printf("********************************\n");
printf("***** 1.add 2.del *****\n");
printf("***** 3.modify 4.search *****\n");
printf("***** 5.sort 6.print *****\n");
printf("***** 0.exit *****\n");
printf("********************************\n");
}
enum Option //枚举
{
EXIT, //0
ADD, //1
DEL, //2
MODIFY, //3
SEARCH, //4
SORT, //5
PRINT //6
};
int main()
{
int input = 0;
Contact con; //创建结构体变量
InitContact(&con); //初始化通讯录
do
{
Menu(); //菜单
printf("请选择:>");
scanf("%d", &input); //选择功能
switch (input)
{
case EXIT:
break;
case ADD:
AddContact(&con); //添加联系人
break;
case DEL:
DelContact(&con); //删除联系人
break;
case MODIFY:
ModifyContact(&con); //修改联系人
break;
case SEARCH:
SearchContact(&con); //查找联系人
break;
case SORT:
SortContact(&con); //按照联系人的性别分类
break;
case PRINT:
PrintContact(&con); //打印通讯录全部信息
break;
default:
printf("非法操作,请重新选择\n");
break;
}
} while (input);
return 0;
}
void InitContact(Contact* pc) //初始化结构体
{
pc->sz = 0;
memset(pc, 0, sizeof(pc->data));
}
void PrintContact(const Contact* pc) //打印通讯录全部信息
{
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
void AddContact(Contact* pc) //添加联系人
{
if (pc->sz >= MAX_PEO)
{
printf("通讯录已满,无法新增\n");
}
else
{
printf("请输入名字:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("联系人增加成功\n");
}
}
static int FindName(const Contact* pc) //查找名字 静态static 该函数只在本文件使用
{
char name[MAX_NAME] = { 0 };
printf("请输入联系人的名字:>");
scanf("%s", name);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void DelContact(Contact* pc) //删除联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除联系人成功\n");
}
void ModifyContact(Contact* pc) //删除联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
printf("请输入更改后的名字:>");
scanf("%s", pc->data[ret].name);
printf("请输入更改后的性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入更改后的年龄:>");
scanf("%d", &pc->data[ret].age);
printf("请输入更改后的电话:>");
scanf("%s", pc->data[ret].tele);
printf("请输入更改后的地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
void SearchContact(Contact* pc) //查找联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].tele,
pc->data[ret].addr);
}
static SortSex(const Contact* pc, char* s) //按照联系人的性别分类
{
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].sex, s) == 0)
{
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
}
void SortContact(Contact* pc) //联系人分类
{
int input;
printf("输入1打印出所有男性的信息,输入2打印出所有女性的信息:>");
scanf("%d", &input);
switch (input)
{
case 1:
SortSex(pc, "男");
break;
case 2:
SortSex(pc, "女");
break;
default:
printf("非法操作,已退出\n");
break;
}
}
test.c:
/*
通讯录-动态版本
通讯录中能够存放100(可修改长度)个人的信息
每个人的信息:
名字+性别+年龄+电话+地址
1. 增加联系人的信息
2. 删除指定人的信息
3. 修改指定人的信息
4. 查找指定人的信息
5. 排序通讯录的信息
6. 打印通讯录所有信息
0. 退出程序
1>通讯录初始化后,能存放3个人的信息
2>当我们空间的存放满的时候,我们增加2个信息
3+2+2+2+...
*/
#include "Contact2.h"
void Menu() //菜单
{
printf("********************************\n");
printf("***** 1.add 2.del *****\n");
printf("***** 3.modify 4.search *****\n");
printf("***** 5.sort 6.print *****\n");
printf("***** 0.exit *****\n");
printf("********************************\n");
}
enum Option //枚举
{
EXIT, //0
ADD, //1
DEL, //2
MODIFY, //3
SEARCH, //4
SORT, //5
PRINT //6
};
int main()
{
int input = 0;
Contact con; //创建结构体变量
InitContact(&con); //初始化通讯录
do
{
Menu(); //菜单
printf("请选择:>");
scanf("%d", &input); //选择功能
switch (input)
{
case EXIT:
DestroyContact(&con); //释放通讯录内存
printf("已退出程序\n");
break;
case ADD:
AddContact(&con); //添加联系人
break;
case DEL:
DelContact(&con); //删除联系人
break;
case MODIFY:
ModifyContact(&con); //修改联系人
break;
case SEARCH:
SearchContact(&con); //查找联系人
break;
case SORT:
SortContact(&con); //联系人分类
break;
case PRINT:
PrintContact(&con); //打印通讯录全部信息
break;
default:
printf("非法操作,请重新选择\n");
break;
}
} while (input);
return 0;
}
Contact2.c:
#include "Contact2.h"
//void InitContact(Contact* pc) //静态初始化结构体
//{
// pc->sz = 0;
// memset(pc, 0, sizeof(pc->data));
//}
void InitContact(Contact* pc) //动态初始化结构体
{
pc->data = (PeoInfo*)calloc(INIT_SZ, sizeof(PeoInfo));
if (pc->data == NULL)
{
perror("InitContact");
return;
}
pc->sz = 0;
pc->capacity = INIT_SZ;
}
void PrintContact(const Contact* pc) //打印通讯录全部信息
{
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
//void AddContact(Contact* pc) //静态添加联系人
//{
// if (pc->sz >= MAX_PEO)
// {
// printf("通讯录已满,无法新增\n");
// }
// else
// {
// printf("请输入名字:>");
// scanf("%s", pc->data[pc->sz].name);
// printf("请输入性别:>");
// scanf("%s", pc->data[pc->sz].sex);
// printf("请输入年龄:>");
// scanf("%d", &pc->data[pc->sz].age);
// printf("请输入电话:>");
// scanf("%s", pc->data[pc->sz].tele);
// printf("请输入地址:>");
// scanf("%s", pc->data[pc->sz].addr);
// pc->sz++;
//
// printf("联系人增加成功\n");
// }
//}
void AddContact(Contact* pc) //动态添加联系人
{
if (pc->sz == pc->capacity)
{
PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + ADD_SZ) * sizeof(PeoInfo));
if (ptr == NULL)
{
perror("AddContact");
printf("增容失败\n");
return;
}
pc->data = ptr;
pc->capacity = ADD_SZ + pc->capacity;
printf("增容成功\n");
}
printf("请输入名字:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("联系人增加成功\n");
}
static int FindName(const Contact* pc) //查找名字 静态static 该函数只在本文件使用
{
char name[MAX_NAME] = { 0 };
printf("请输入联系人的名字:>");
scanf("%s", name);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void DelContact(Contact* pc) //删除联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除联系人成功\n");
}
void ModifyContact(Contact* pc) //修改联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
printf("请输入更改后的名字:>");
scanf("%s", pc->data[ret].name);
printf("请输入更改后的性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入更改后的年龄:>");
scanf("%d", &pc->data[ret].age);
printf("请输入更改后的电话:>");
scanf("%s", pc->data[ret].tele);
printf("请输入更改后的地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
void SearchContact(Contact* pc) //查找联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].tele,
pc->data[ret].addr);
}
static SortSex(const Contact* pc, char* s) //按照联系人的性别分类
{
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].sex, s) == 0)
{
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
}
void SortContact(Contact* pc) //联系人分类
{
int input;
printf("输入1打印出所有男性的信息,输入2打印出所有女性的信息:>");
scanf("%d", &input);
switch (input)
{
case 1:
SortSex(pc, "男");
break;
case 2:
SortSex(pc, "女");
break;
default:
printf("非法操作,已退出\n");
break;
}
}
void DestroyContact(Contact* pc) //释放通讯录内存
{
free(pc->data);
pc->data = NULL;
pc->sz = 0;
pc->capacity = 0;
}
Contact2.h:
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#define MAX_NAME 20 //设置名字最大长度
#define MAX_SEX 10 //设置性别最大长度
#define MAX_TELE 12 //设置电话最大长度
#define MAX_ADDR 30 //设置地址最大长度
//#define MAX_PEO 100 //设置通讯录人数最大长度 (动态内存时不够空间可直接开辟)
#define INIT_SZ 3 //设置初始时容量的大小
#define ADD_SZ 2 //设置每次拓展的容量
typedef struct PeoInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo; //结构体自定义类型名为PeoInfo
//typedef struct Contact
//{
// PeoInfo data[MAX_PEO];
// int sz;
//}Contact; //静态结构体自定义类型名为Contact
typedef struct Contact
{
PeoInfo *data; //指向动态申请的空间,用来存放联系人的信息
int sz; //记录当前通讯录中有效信息的个数
int capacity; //记录当前通讯录的最大容量
}Contact; //动态结构体自定义类型名为Contact
void InitContact(Contact* pc); //初始化通讯录
void AddContact(Contact* pc); //添加联系人
void PrintContact(Contact* pc); //打印通讯录全部信息
void DelContact(Contact* pc); //删除联系人
void ModifyContact(Contact* pc); //修改联系人
void SearchContact(Contact* pc); //查找联系人
void SortContact(Contact* pc); //按照联系人的性别分类
void DestroyContact(Contact* pc); //释放通讯录内存
完整代码:
/*
通讯录-动态版本
通讯录中能够存放100(可修改长度)个人的信息
每个人的信息:
名字+性别+年龄+电话+地址
1. 增加联系人的信息
2. 删除指定人的信息
3. 修改指定人的信息
4. 查找指定人的信息
5. 排序通讯录的信息
6. 打印通讯录所有信息
0. 退出程序
1>通讯录初始化后,能存放3个人的信息
2>当我们空间的存放满的时候,我们增加2个信息
3+2+2+2+...
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#define MAX_NAME 20 //设置名字最大长度
#define MAX_SEX 10 //设置性别最大长度
#define MAX_TELE 12 //设置电话最大长度
#define MAX_ADDR 30 //设置地址最大长度
//#define MAX_PEO 100 //设置通讯录人数最大长度 (动态内存时不够空间可直接开辟)
#define INIT_SZ 3 //设置初始时容量的大小
#define ADD_SZ 2 //设置每次拓展的容量
typedef struct PeoInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo; //结构体自定义类型名为PeoInfo
//typedef struct Contact
//{
// PeoInfo data[MAX_PEO];
// int sz;
//}Contact; //静态结构体自定义类型名为Contact
typedef struct Contact
{
PeoInfo* data; //指向动态申请的空间,用来存放联系人的信息
int sz; //记录当前通讯录中有效信息的个数
int capacity; //记录当前通讯录的最大容量
}Contact; //动态结构体自定义类型名为Contact
void InitContact(Contact* pc); //初始化结构体
void AddContact(Contact* pc); //添加联系人
void PrintContact(Contact* pc); //打印通讯录全部信息
void DelContact(Contact* pc); //删除联系人
void ModifyContact(Contact* pc); //更改联系人
void SearchContact(Contact* pc); //查找联系人
void SortContact(Contact* pc); //按照联系人的性别分类
void DestroyContact(Contact* pc); //释放通讯录内存
void Menu() //菜单
{
printf("********************************\n");
printf("***** 1.add 2.del *****\n");
printf("***** 3.modify 4.search *****\n");
printf("***** 5.sort 6.print *****\n");
printf("***** 0.exit *****\n");
printf("********************************\n");
}
enum Option //枚举
{
EXIT, //0
ADD, //1
DEL, //2
MODIFY, //3
SEARCH, //4
SORT, //5
PRINT //6
};
int main()
{
int input = 0;
Contact con; //创建结构体变量
InitContact(&con); //初始化结构体
do
{
Menu(); //菜单
printf("请选择:>");
scanf("%d", &input); //选择功能
switch (input)
{
case EXIT:
DestroyContact(&con); //释放通讯录内存
printf("已退出程序\n");
break;
case ADD:
AddContact(&con); //添加联系人
break;
case DEL:
DelContact(&con); //删除联系人
break;
case MODIFY:
ModifyContact(&con); //删除联系人
break;
case SEARCH:
SearchContact(&con); //查找联系人
break;
case SORT:
SortContact(&con); //联系人分类
break;
case PRINT:
PrintContact(&con); //打印通讯录全部信息
break;
default:
printf("非法操作,请重新选择\n");
break;
}
} while (input);
return 0;
}
//void InitContact(Contact* pc) //静态初始化结构体
//{
// pc->sz = 0;
// memset(pc, 0, sizeof(pc->data));
//}
void InitContact(Contact* pc) //动态初始化结构体
{
pc->data = (PeoInfo*)calloc(INIT_SZ, sizeof(PeoInfo));
if (pc->data == NULL)
{
perror("InitContact");
return;
}
pc->sz = 0;
pc->capacity = INIT_SZ;
}
void PrintContact(const Contact* pc) //打印通讯录全部信息
{
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
//void AddContact(Contact* pc) //静态添加联系人
//{
// if (pc->sz >= MAX_PEO)
// {
// printf("通讯录已满,无法新增\n");
// }
// else
// {
// printf("请输入名字:>");
// scanf("%s", pc->data[pc->sz].name);
// printf("请输入性别:>");
// scanf("%s", pc->data[pc->sz].sex);
// printf("请输入年龄:>");
// scanf("%d", &pc->data[pc->sz].age);
// printf("请输入电话:>");
// scanf("%s", pc->data[pc->sz].tele);
// printf("请输入地址:>");
// scanf("%s", pc->data[pc->sz].addr);
// pc->sz++;
//
// printf("联系人增加成功\n");
// }
//}
void AddContact(Contact* pc) //动态添加联系人
{
if (pc->sz == pc->capacity)
{
PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + ADD_SZ) * sizeof(PeoInfo));
if (ptr == NULL)
{
perror("AddContact");
printf("增容失败\n");
return;
}
pc->data = ptr;
pc->capacity = ADD_SZ + pc->capacity;
printf("增容成功\n");
}
printf("请输入名字:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("联系人增加成功\n");
}
static int FindName(const Contact* pc) //查找名字 静态static 该函数只在本文件使用
{
char name[MAX_NAME] = { 0 };
printf("请输入联系人的名字:>");
scanf("%s", name);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void DelContact(Contact* pc) //删除联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除联系人成功\n");
}
void ModifyContact(Contact* pc) //修改联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
printf("请输入更改后的名字:>");
scanf("%s", pc->data[ret].name);
printf("请输入更改后的性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入更改后的年龄:>");
scanf("%d", &pc->data[ret].age);
printf("请输入更改后的电话:>");
scanf("%s", pc->data[ret].tele);
printf("请输入更改后的地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
void SearchContact(Contact* pc) //查找联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].tele,
pc->data[ret].addr);
}
static SortSex(const Contact* pc, char* s) //按照联系人的性别分类
{
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].sex, s) == 0)
{
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
}
void SortContact(Contact* pc) //联系人分类
{
int input;
printf("输入1打印出所有男性的信息,输入2打印出所有女性的信息:>");
scanf("%d", &input);
switch (input)
{
case 1:
SortSex(pc, "男");
break;
case 2:
SortSex(pc, "女");
break;
default:
printf("非法操作,已退出\n");
break;
}
}
void DestroyContact(Contact* pc) //释放通讯录内存
{
free(pc->data);
pc->data = NULL;
pc->sz = 0;
pc->capacity = 0;
}
test.c:
/*
通讯录-动态版本(含文件保存)
通讯录中能够存放100(可修改长度)个人的信息
每个人的信息:
名字+性别+年龄+电话+地址
1. 增加联系人的信息
2. 删除指定人的信息
3. 修改指定人的信息
4. 查找指定人的信息
5. 排序通讯录的信息
6. 打印通讯录所有信息
0. 退出程序
1>通讯录初始化后,能存放3个人的信息
2>当我们空间的存放满的时候,我们增加2个信息
3+2+2+2+...
当通讯录退出的时候,把信息写到文件
当通讯录初始化的时候,加载文件的信息到通讯录中
*/
#include "Contact3.h"
void Menu() //菜单
{
printf("********************************\n");
printf("***** 1.add 2.del *****\n");
printf("***** 3.modify 4.search *****\n");
printf("***** 5.sort 6.print *****\n");
printf("***** 0.exit&save *****\n");
printf("********************************\n");
}
enum Option //枚举
{
EXIT, //0
ADD, //1
DEL, //2
MODIFY, //3
SEARCH, //4
SORT, //5
PRINT //6
};
int main()
{
int input = 0;
Contact con; //创建结构体变量
InitContact(&con); //初始化通讯录
do
{
Menu(); //菜单
printf("请选择:>");
scanf("%d", &input); //选择功能
switch (input)
{
case EXIT:
SaveContact(&con); //用文件保存通讯录信息
DestroyContact(&con); //释放通讯录内存
printf("已保存程序,已退出程序\n");
break;
case ADD:
AddContact(&con); //添加联系人
break;
case DEL:
DelContact(&con); //删除联系人
break;
case MODIFY:
ModifyContact(&con); //修改联系人
break;
case SEARCH:
SearchContact(&con); //查找联系人
break;
case SORT:
SortContact(&con); //联系人分类
break;
case PRINT:
PrintContact(&con); //打印通讯录全部信息
break;
default:
printf("非法操作,请重新选择\n");
break;
}
} while (input);
return 0;
}
Contact3.c:
#include "Contact3.h"
//void InitContact(Contact* pc) //静态初始化结构体
//{
// pc->sz = 0;
// memset(pc, 0, sizeof(pc->data));
//}
//void InitContact(Contact* pc) //动态初始化结构体
//{
// pc->data = (PeoInfo*)calloc(INIT_SZ, sizeof(PeoInfo));
// if (pc->data == NULL)
// {
// perror("InitContact");
// return;
// }
// pc->sz = 0;
// pc->capacity = INIT_SZ;
//}
void InitContact(Contact* pc) //文件动态初始化结构体
{
pc->data = (PeoInfo*)calloc(INIT_SZ, sizeof(PeoInfo));
if (pc->data == NULL)
{
perror("InitContact");
return;
}
pc->sz = 0;
pc->capacity = INIT_SZ;
LoadContact(pc); //加载文件
}
void LoadContact(Contact* pc) //加载文件
{
FILE* pf = fopen("Contact3.dat", "r"); //打开指定文件读取
if (pf == NULL)
{
perror("LoadContact");
return;
}
PeoInfo t = { 0 };
while (fread(&t, sizeof(PeoInfo), 1, pf)) //输入文件内容
{
CheckCapacity(pc); //检查是否要增容
pc->data[pc->sz] = t;
pc->sz++;
}
fclose(pf); //关闭该文件
pf = NULL;
}
void CheckCapacity(Contact* pc) //检查是否要增容
{
if (pc->sz == pc->capacity)
{
PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + ADD_SZ) * sizeof(PeoInfo));
if (ptr == NULL)
{
perror("AddContact");
printf("增容失败\n");
return;
}
pc->data = ptr;
pc->capacity = ADD_SZ + pc->capacity;
printf("增容成功\n");
}
}
void PrintContact(const Contact* pc) //打印通讯录全部信息
{
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
//void AddContact(Contact* pc) //静态添加联系人
//{
// if (pc->sz >= MAX_PEO)
// {
// printf("通讯录已满,无法新增\n");
// }
// else
// {
// printf("请输入名字:>");
// scanf("%s", pc->data[pc->sz].name);
// printf("请输入性别:>");
// scanf("%s", pc->data[pc->sz].sex);
// printf("请输入年龄:>");
// scanf("%d", &pc->data[pc->sz].age);
// printf("请输入电话:>");
// scanf("%s", pc->data[pc->sz].tele);
// printf("请输入地址:>");
// scanf("%s", pc->data[pc->sz].addr);
// pc->sz++;
//
// printf("联系人增加成功\n");
// }
//}
void AddContact(Contact* pc) //动态添加联系人
{
CheckCapacity(pc);
printf("请输入名字:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("联系人增加成功\n");
}
static int FindName(const Contact* pc) //查找名字 静态static 该函数只在本文件使用
{
char name[MAX_NAME] = { 0 };
printf("请输入联系人的名字:>");
scanf("%s", name);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void DelContact(Contact* pc) //删除联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除联系人成功\n");
}
void ModifyContact(Contact* pc) //修改联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
printf("请输入更改后的名字:>");
scanf("%s", pc->data[ret].name);
printf("请输入更改后的性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入更改后的年龄:>");
scanf("%d", &pc->data[ret].age);
printf("请输入更改后的电话:>");
scanf("%s", pc->data[ret].tele);
printf("请输入更改后的地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
void SearchContact(Contact* pc) //查找联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].tele,
pc->data[ret].addr);
}
static SortSex(const Contact* pc, char* s) //按照联系人的性别分类
{
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].sex, s) == 0)
{
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
}
void SortContact(Contact* pc) //联系人分类
{
int input;
printf("输入1打印出所有男性的信息,输入2打印出所有女性的信息:>");
scanf("%d", &input);
switch (input)
{
case 1:
SortSex(pc, "男");
break;
case 2:
SortSex(pc, "女");
break;
default:
printf("非法操作,已退出\n");
break;
}
}
void DestroyContact(Contact* pc) //释放通讯录内存
{
free(pc->data);
pc->data = NULL;
pc->sz = 0;
pc->capacity = 0;
}
void SaveContact(Contact* pc) //用文件保存通讯录信息
{
FILE* pf = fopen("Contact3.dat", "w"); //打开指定文件输出
if (pf == NULL)
{
perror("SaveContact");
return;
}
int i = 0;
for (i = 0; i < pc->sz; i++) //输出内容
{
fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
}
fclose(pf); //关闭该文件
pf = NULL;
}
Contact3.h:
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#define MAX_NAME 20 //设置名字最大长度
#define MAX_SEX 10 //设置性别最大长度
#define MAX_TELE 12 //设置电话最大长度
#define MAX_ADDR 30 //设置地址最大长度
//#define MAX_PEO 100 //设置通讯录人数最大长度 (动态内存时不够空间可直接开辟)
#define INIT_SZ 3 //设置初始时容量的大小
#define ADD_SZ 2 //设置每次拓展的容量
typedef struct PeoInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo; //结构体自定义类型名为PeoInfo
//typedef struct Contact
//{
// PeoInfo data[MAX_PEO];
// int sz;
//}Contact; //静态结构体自定义类型名为Contact
typedef struct Contact
{
PeoInfo* data; //指向动态申请的空间,用来存放联系人的信息
int sz; //记录当前通讯录中有效信息的个数
int capacity; //记录当前通讯录的最大容量
}Contact; //动态结构体自定义类型名为Contact
void InitContact(Contact* pc); //初始化通讯录
void AddContact(Contact* pc); //添加联系人
void PrintContact(Contact* pc); //打印通讯录全部信息
void DelContact(Contact* pc); //删除联系人
void ModifyContact(Contact* pc); //修改联系人
void SearchContact(Contact* pc); //查找联系人
void SortContact(Contact* pc); //按照联系人的性别分类
void DestroyContact(Contact* pc); //释放通讯录内存
void SaveContact(Contact* pc); //用文件保存通讯录信息
void LoadContact(Contact* pc); //加载文件
void CheckCapacity(Contact* pc); //检查是否要增容
完整代码:
/*
通讯录-动态版本(含文件保存)
通讯录中能够存放100(可修改长度)个人的信息
每个人的信息:
名字+性别+年龄+电话+地址
1. 增加联系人的信息
2. 删除指定人的信息
3. 修改指定人的信息
4. 查找指定人的信息
5. 排序通讯录的信息
6. 打印通讯录所有信息
0. 退出程序
1>通讯录初始化后,能存放3个人的信息
2>当我们空间的存放满的时候,我们增加2个信息
3+2+2+2+...
当通讯录退出的时候,把信息写到文件
当通讯录初始化的时候,加载文件的信息到通讯录中
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#define MAX_NAME 20 //设置名字最大长度
#define MAX_SEX 10 //设置性别最大长度
#define MAX_TELE 12 //设置电话最大长度
#define MAX_ADDR 30 //设置地址最大长度
//#define MAX_PEO 100 //设置通讯录人数最大长度 (动态内存时不够空间可直接开辟)
#define INIT_SZ 3 //设置初始时容量的大小
#define ADD_SZ 2 //设置每次拓展的容量
typedef struct PeoInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo; //结构体自定义类型名为PeoInfo
//typedef struct Contact
//{
// PeoInfo data[MAX_PEO];
// int sz;
//}Contact; //静态结构体自定义类型名为Contact
typedef struct Contact
{
PeoInfo* data; //指向动态申请的空间,用来存放联系人的信息
int sz; //记录当前通讯录中有效信息的个数
int capacity; //记录当前通讯录的最大容量
}Contact; //动态结构体自定义类型名为Contact
void InitContact(Contact* pc); //初始化通讯录
void AddContact(Contact* pc); //添加联系人
void PrintContact(Contact* pc); //打印通讯录全部信息
void DelContact(Contact* pc); //删除联系人
void ModifyContact(Contact* pc); //更改联系人
void SearchContact(Contact* pc); //查找联系人
void SortContact(Contact* pc); //按照联系人的性别分类
void DestroyContact(Contact* pc); //释放通讯录内存
void SaveContact(Contact* pc); //用文件保存通讯录信息
void LoadContact(Contact* pc); //加载文件
void CheckCapacity(Contact* pc); //检查是否要增容
void Menu() //菜单
{
printf("********************************\n");
printf("***** 1.add 2.del *****\n");
printf("***** 3.modify 4.search *****\n");
printf("***** 5.sort 6.print *****\n");
printf("***** 0.exit&save *****\n");
printf("********************************\n");
}
enum Option //枚举
{
EXIT, //0
ADD, //1
DEL, //2
MODIFY, //3
SEARCH, //4
SORT, //5
PRINT //6
};
int main()
{
int input = 0;
Contact con; //创建结构体变量
InitContact(&con); //初始化通讯录
do
{
Menu(); //菜单
printf("请选择:>");
scanf("%d", &input); //选择功能
switch (input)
{
case EXIT:
SaveContact(&con); //用文件保存通讯录信息
DestroyContact(&con); //释放通讯录内存
printf("已保存程序,已退出程序\n");
break;
case ADD:
AddContact(&con); //添加联系人
break;
case DEL:
DelContact(&con); //删除联系人
break;
case MODIFY:
ModifyContact(&con); //修改联系人
break;
case SEARCH:
SearchContact(&con); //查找联系人
break;
case SORT:
SortContact(&con); //联系人分类
break;
case PRINT:
PrintContact(&con); //打印通讯录全部信息
break;
default:
printf("非法操作,请重新选择\n");
break;
}
} while (input);
return 0;
}
//void InitContact(Contact* pc) //静态初始化结构体
//{
// pc->sz = 0;
// memset(pc, 0, sizeof(pc->data));
//}
//void InitContact(Contact* pc) //动态初始化结构体
//{
// pc->data = (PeoInfo*)calloc(INIT_SZ, sizeof(PeoInfo));
// if (pc->data == NULL)
// {
// perror("InitContact");
// return;
// }
// pc->sz = 0;
// pc->capacity = INIT_SZ;
//}
void InitContact(Contact* pc) //文件动态初始化结构体
{
pc->data = (PeoInfo*)calloc(INIT_SZ, sizeof(PeoInfo));
if (pc->data == NULL)
{
perror("InitContact");
return;
}
pc->sz = 0;
pc->capacity = INIT_SZ;
LoadContact(pc); //加载文件
}
void LoadContact(Contact* pc) //加载文件
{
FILE* pf = fopen("Contact3_zong.dat", "r"); //打开指定文件读取
if (pf == NULL)
{
perror("LoadContact");
return;
}
PeoInfo t = { 0 };
while (fread(&t, sizeof(PeoInfo), 1, pf)) //输入文件内容
{
CheckCapacity(pc); //检查是否要增容
pc->data[pc->sz] = t;
pc->sz++;
}
fclose(pf); //关闭该文件
pf = NULL;
}
void CheckCapacity(Contact* pc) //检查是否要增容
{
if (pc->sz == pc->capacity)
{
PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + ADD_SZ) * sizeof(PeoInfo));
if (ptr == NULL)
{
perror("AddContact");
printf("增容失败\n");
return;
}
pc->data = ptr;
pc->capacity = ADD_SZ + pc->capacity;
printf("增容成功\n");
}
}
void PrintContact(const Contact* pc) //打印通讯录全部信息
{
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
//void AddContact(Contact* pc) //静态添加联系人
//{
// if (pc->sz >= MAX_PEO)
// {
// printf("通讯录已满,无法新增\n");
// }
// else
// {
// printf("请输入名字:>");
// scanf("%s", pc->data[pc->sz].name);
// printf("请输入性别:>");
// scanf("%s", pc->data[pc->sz].sex);
// printf("请输入年龄:>");
// scanf("%d", &pc->data[pc->sz].age);
// printf("请输入电话:>");
// scanf("%s", pc->data[pc->sz].tele);
// printf("请输入地址:>");
// scanf("%s", pc->data[pc->sz].addr);
// pc->sz++;
//
// printf("联系人增加成功\n");
// }
//}
void AddContact(Contact* pc) //动态添加联系人
{
CheckCapacity(pc);
printf("请输入名字:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("联系人增加成功\n");
}
static int FindName(const Contact* pc) //查找名字 静态static 该函数只在本文件使用
{
char name[MAX_NAME] = { 0 };
printf("请输入联系人的名字:>");
scanf("%s", name);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void DelContact(Contact* pc) //删除联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除联系人成功\n");
}
void ModifyContact(Contact* pc) //修改联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
printf("请输入更改后的名字:>");
scanf("%s", pc->data[ret].name);
printf("请输入更改后的性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入更改后的年龄:>");
scanf("%d", &pc->data[ret].age);
printf("请输入更改后的电话:>");
scanf("%s", pc->data[ret].tele);
printf("请输入更改后的地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
void SearchContact(Contact* pc) //查找联系人
{
int ret = FindName(pc);
if (ret == -1)
{
printf("查无此人\n");
return;
}
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].tele,
pc->data[ret].addr);
}
static SortSex(const Contact* pc, char* s) //按照联系人的性别分类
{
printf("%-20s\t%-10s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].sex, s) == 0)
{
printf("%-20s\t%-10s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
}
void SortContact(Contact* pc) //联系人分类
{
int input;
printf("输入1打印出所有男性的信息,输入2打印出所有女性的信息:>");
scanf("%d", &input);
switch (input)
{
case 1:
SortSex(pc, "男");
break;
case 2:
SortSex(pc, "女");
break;
default:
printf("非法操作,已退出\n");
break;
}
}
void DestroyContact(Contact* pc) //释放通讯录内存
{
free(pc->data);
pc->data = NULL;
pc->sz = 0;
pc->capacity = 0;
}
void SaveContact(Contact* pc) //用文件保存通讯录信息
{
FILE* pf = fopen("Contact3_zong.dat", "w"); //打开指定文件输出
if (pf == NULL)
{
perror("SaveContact");
return;
}
int i = 0;
for (i = 0; i < pc->sz; i++) //输出内容
{
fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
}
fclose(pf); //关闭该文件
pf = NULL;
}