目录
1.通讯录的头文件
2.通讯录的逻辑
3.通讯录的实现
contest.h
#include
#include
#include
#define MAX 1000
#define MAX_NAME 10
#define MAX_SEX 10
#define MAX_TEL 15
#define MAX_ADDR 20
#define MAX_CAPACITY 3
//类型的声明
//人的类型,封装成一个结构体
typedef struct peoinfo
{
char name[MAX_NAME]; // 名字
int age; //年龄
char sex[MAX_SEX]; //性别
char tel[MAX_TEL]; //电话
char addr[MAX_ADDR]; //地址
}peoinfo;
//静态版本
//通讯录的声明 ,封装成一个结构体
//typedef struct contest
//{
// peoinfo date[MAX]; //通讯录中可以存储的人数
//
// int count; //通讯录中实际的人数
//
//}contest;
//动态版本
typedef struct contest
{
peoinfo* date; //通讯录中可以存储的人数
int count; //通讯录中实际的人数
int capacity; //通讯里中最大容量
}contest;
//初始化通讯录
void initcontest(contest* pc ); //地址用结构体指针来接收
//通讯录的加法
void addcontest(contest* pc);
//通讯录的打印
void showcontest(contest* pc);
//通讯录的减法
void delcontest(contest* pc);
//通讯录的查找
void searchcontest(contest* pc);
//通讯录的修改
void modifycontest(contest* pc);
//排序通讯录
void sortcontest(contest* pc);
//释放通讯录
void freecontest(contest* pc);
test.c
#include"contest.h"
void menu()
{
printf("******** 1.add 2.del **********\n");
printf("******** 3.search 4.modify **********\n");
printf("******** 5.show 6.sort **********\n");
printf("******** 0.exit **********\n");
}
void test()
{
int input = 0;
contest con; //创建一个通讯录变量
initcontest(&con); //初始化通讯录,通讯录是一个结构体要传地址
do
{
menu();
printf("请输入选择的数字>:");
scanf("%d", &input);
switch (input)
{
case 1:
addcontest(&con);
break;
case 2:
delcontest(&con);
break;
case 3:
searchcontest(&con);
break;
case 4:
modifycontest(&con);
break;
case 5:
showcontest(&con);
break;
case 6:
sortcontest(&con);
break;
case 0:
//动态内存开辟的话最后要释放空间
freecontest(&con);
printf("退出通讯录\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
contest.c
#include"contest.h"
//静态版本
//初始化通讯录
//void initcontest(contest* pc)
//{
// pc->count = 0; //通讯录中实际上放的人初始化为0
//
// memset(pc->date,0,sizeof(pc->date));
//
// //memset(首地址,值,sizeof(地址总大小));
// //
// //pc->date,是一个数组,数组名是首元素的地址
// //sizeof(数组名)是整个数组的大小
//}
//动态版本
void initcontest(contest* pc)
{
pc->count = 0; //通讯录中实际上放的人初始化为0
pc->capacity = MAX_CAPACITY; //通讯录最大容量为3,这个可以自定义
//给通讯录开辟空间
pc->date = (peoinfo*)malloc(pc->capacity * sizeof(peoinfo));
//容量乘以一个人的信息,开辟一个字节个数,3容量乘以一个人信息,得到的是3个人的信息,
if (pc->date== NULL)//如果得到空指针则开辟失败要返回错误
{
perror("initcontest::malloc");
}
memset(pc->date,0, pc->capacity * sizeof(peoinfo));
//把这里面的数初始化成0
}
//静态版本
//
通讯录的加法
//void addcontest(contest* pc)
//{
// if (pc->count == MAX)
// {
// printf("通讯录已满,无法添加\n");
// }
//
// printf("请输入名字>");
// scanf("%s", pc->date[pc->count].name);
// //count作为date的下标,当date没人的时候count是里面0
// //当date里面有一个人的时候,把这个人放在下标为count 0的下标里面,再放入的时候date里面有2个人
// //他的下标就是count里的1 ,count可以作为date的下标使用
// printf("请输入年龄>");
// scanf("%d", &(pc->date[pc->count].age)); //int 是整形,要用%d来打印,需要取地址,别的是arr数组,首元素就是地址
//
// printf("请输入性别>");
// scanf("%s", pc->date[pc->count].sex);
//
// printf("请输入电话>");
// scanf("%s", pc->date[pc->count].tel);
//
// printf("请输入地址>");
// scanf("%s", pc->date[pc->count].addr);
//
// pc->count++;
// printf("添加成功\n");
//}
void checkaddtest(contest* pc)
{
if (pc->capacity == pc->count)
//扩容的时候每次加2个
{
peoinfo* tmp = (peoinfo*)realloc(pc->date, (pc->capacity + 2) * sizeof(peoinfo));
if (tmp != NULL)
{
pc->date = tmp;
}
pc->capacity = pc->capacity+2;
printf("增容成功\n");
}
}
//动态版本
//通讯录的加法
void addcontest(contest* pc)
{
checkaddtest(pc);
printf("请输入名字>");
scanf("%s", pc->date[pc->count].name);
//count作为date的下标,当date没人的时候count是里面0
//当date里面有一个人的时候,把这个人放在下标为count 0的下标里面,再放入的时候date里面有2个人
//他的下标就是count里的1 ,count可以作为date的下标使用
printf("请输入年龄>");
scanf("%d", &(pc->date[pc->count].age)); //int 是整形,要用%d来打印,需要取地址,别的是arr数组,首元素就是地址
printf("请输入性别>");
scanf("%s", pc->date[pc->count].sex);
printf("请输入电话>");
scanf("%s", pc->date[pc->count].tel);
printf("请输入地址>");
scanf("%s", pc->date[pc->count].addr);
pc->count++;
printf("添加成功\n");
}
//释放通讯录
void freecontest(contest* pc)
{
pc->count = 0;
pc->capacity = 0;
free(pc->date);
pc->date = NULL;
printf("销毁成功\n");
}
//通讯录的打印实现
void showcontest(contest* pc)
{
//首先遍历一下已经存的人数
int i = 0;
printf("%20s %5s %10s %15s %20s\n", "姓名", "年龄", "性别","电话","地址");
for (i = 0; i < pc->count; i++)
{
printf("%20s %5d %10s %15s %20s\n", pc->date[i].name, pc->date[i].age, pc->date[i].sex
, pc->date[i].tel, pc->date[i].addr);
}
}
//查找函数
int findcontest(contest* pc,char name[])
{
//首先遍历一下已经存的人数
int i = 0;
for (i = 0; i < pc->count; i++)
{
//看看通讯录中有没有名字一样的人数
if (0 == strcmp(pc->date[i].name, name))
{
return i; //有的话返回下标
}
return -1;
}
}
//通讯录减法的实现
void delcontest(contest* pc)
{
char name[MAX_NAME] = { 0 };
if (pc->count == 0)
{
printf("通讯录为空\n");
}
//1.查找
printf("请输入要删除人的名字");
scanf("%s", name);
int pos = findcontest(pc,name);
if (pos == -1)
{
printf("要删除的人不存在\n");
return;
}
//2.删除
int j = 0;
for (j = 0; j < pc->count-1; j++)
//容量是1000,如果是pc->count,那么j最大是999,下面要+1,会造成越界
//pc->count-1的话,j最大是998,下面加一是999,容量是1000不会越界
{
pc->date[j] = pc->date[j + 1];
}
pc->count--;
printf("删除成功\n");
}
//通讯录的查找
void searchcontest(contest* pc)
{
//1.查找
char name[MAX_NAME] = { 0 };
if (pc->count == 0)
{
printf("通讯录为空\n");
}
printf("请输入要查找人的名字");
scanf("%s", name);
int pos = findcontest(pc, name);
if (pos == -1)
{
printf("要查找的人不存在\n");
return;
}
printf("%20s %5s %10s %15s %20s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%20s %5d %10s %15s %20s\n", pc->date[pos].name, pc->date[pos].age, pc->date[pos].sex
, pc->date[pos].tel, pc->date[pos].addr);
}
//通讯录修改的实现
void modifycontest(contest* pc)
{
//1.查找
char name[MAX_NAME] = { 0 };
if (pc->count == 0)
{
printf("通讯录为空\n");
}
printf("请输入要修改人的名字");
scanf("%s", name);
int pos = findcontest(pc, name);
if (pos == -1)
{
printf("要修改的人不存在\n");
return;
}
//2.修改
printf("请输入名字>");
scanf("%s", pc->date[pos].name);
printf("请输入年龄>");
scanf("%d", &(pc->date[pos].age));
printf("请输入性别>");
scanf("%s", pc->date[pos].sex);
printf("请输入电话>");
scanf("%s", pc->date[pos].tel);
printf("请输入地址>");
scanf("%s", pc->date[pos].addr);
printf("修改成功\n");
}
int cmp_sort(const void* e1, const void* e2)
{
return strcmp(((peoinfo*)e1)->name, ((peoinfo*)e2)->name);
}
//排序通讯录
void sortcontest(contest* pc)
{
//用qsort函数
qsort(pc->date,pc->count,sizeof(peoinfo),cmp_sort);
//地址,元素个数,元素大小,比较函数
printf("排序成功\n");
}
这就是一个完整的通讯录实现啦
谢谢大家的观看!!!!