文章目录
实现通讯录
1.分3个文件实现
1.1contact.h(主要包含函数实现的一些头文件和声明)
在编译器中创建一个头文件contact.h,这个文件主要包括一些库函数头文件的引用,结构体的创建,还有一些枚举和define 定义的一些常量。
1.2contact.c(功能函数实现)
这个文件主要包括一些实现通讯录功能的函数的编写和一些其他的辅助函数
1.3test.c(包含主函数)
这个文件包括主函数,我把菜单的打印也放在了这个文件中,还有一些选择通讯录功能的switch语句
2.开始之前的准备工作
2.1声明储存联系人的结构体
typedef struct PeoInfo
{
char name[NAME];
int age;
char sex[SEX];
char tele[TELE];
char adress[ADRESS];
}PeoInfo;
typedef struct contact
{
int sz;
PeoInfo* data;
int contact;
}contact;
2.3创建通讯录
Init_contact(&con);//初始化通讯录
2.3初始化通讯录
创建一个函数初始化通讯录
void Init_contcat(contact* pc)
{
pc->sz = 0;
pc->contact = SIZE;
pc->data = (PeoInfo*)malloc(pc->contact * sizeof(PeoInfo));//动态开辟空间
if (pc->data == NULL)//当动态空间开辟不成功时报错
{
perror(malloc);
}
memset(pc->data, 0, pc->contact* sizeof(PeoInfo));
}
3.通讯录的基本功能实现(由各部分的函数实现)
3.1添加联系人Add
开辟动态空间,当空间不足时,增容,可以更有效的利用空间
void Increase_contact(contact* pc)//当空间不足时增容
{
if (pc->sz == pc->contact)
{
PeoInfo* tmp = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo) * (pc->contact + 2));
if (tmp == NULL)
{
perror(realloc);
return;
}
else
{
pc->data = tmp;
}
pc->contact += 2;
printf("增容成功\n");
}
}
添加联系人的函数
void Add_contact(contact* pc)//添加联系人
{
/*if (pc->sz == MAX)
{
printf("通讯录已满,添加失败\n");
}*/
Increase_contact(pc);
printf("请输入名字\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别\n");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄\n");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入地址\n");
scanf("%s", pc->data[pc->sz].adress);
printf("请输入电话\n");
scanf("%s", pc->data[pc->sz].tele);
pc->sz++;
printf("添加成功\n");
}
3.2删除联系人Delete
先写一个比较函数
int Is_by_name(contact* pc, char* name[])
{
for (int i = 0; i < pc->sz; i++)
{
if (0 == srcmp(pc->data->name, name))
{
return i;
}
}
return -1;
}
然后是Delete_contact函数
void Delete_contact(contact* pc)
{
printf("输入要删除联系人的名字:>\n");
char name[20];
scanf("%s", name);
int len=Is_by_name(pc, name);
if (pc->sz == 0)
{
printf("通讯录已空无法删除\n");
return;
}
if (len == -1)
{
printf("查无此人\n");
return;
}
else
{
for (int i = len; i < pc->sz; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功\n");
}
}
3.3搜索联系人Search
搜索联系人并且将搜索到的联系人打印,这里就需要上面写的Is_by_name函数
void Search_contact(contact* pc)
{
printf("输入要搜索联系人的姓名:>\n");
char name[20];
scanf("%s", name);
int len = Is_by_name(pc, name);
if (-1==len)
{
printf("查无此人\n");
}
else
{
printf(" % 10s\t % 4s\t % 5s\t % 12s\t % 20s\n", "姓名", "性别", "年龄", "电话", "住址");
printf(" % 10s\t % 4s\t % 5d\t % 12s\t % 20s\n",
pc->data [len].name ,
pc->data [len].sex ,
pc->data [len].age ,
pc->data [len].tele ,
pc->data [len].adress );
}
}
3.4修改联系人Modify
void Modify_contact(contact* pc)
{
printf("输入需要修改的联系人:>\n;");
char name[20];
scanf("%s", name);
int len=Is_by_name(pc, name);
rintf("请输入名字:>\n");
scanf("%s", pc->data[len].name );
printf("请输入性别:>\n");
scanf("%s", pc->data [len].sex );
printf("请输入年龄:>\n");
scanf("%d", &pc->data[len].age );
printf("请输入电话:>\n");
scanf("%s", pc->data[len].tele );
printf("请输入住址:>\n");
scanf("%s", pc->data ->adress );
printf("修改成功\n");
}
3.5打印联系人Print
void Print_contact(contact* pc)
{
printf(" % 10s\t % 4s\t % 5s\t % 12s\t % 20s\n", "姓名", "性别", "年龄", "电话", "住址");
for (int i = 0; i < pc->sz; i++)
{
printf(" % 10s\t % 4s\t % 5d\t % 12s\t % 20s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].adress);
}
}
3.6让联系人以某种方式排序Sort
这里用了qsort
int cmp_by_name(const void* e1, const void* e2)
{
return strcmp((const char*)e1, (const char*)e2);
}
void Sort_contact(contact* pc)
{
qsort(pc->data->name , pc->sz, sizeof(PeoInfo), cmp_by_name);
}
3.7退出通讯录Exit,并且销毁
释放开辟的动态空间
void Destory_contact(contact* pc)
{
free(pc);
pc->contact = 0;
pc->sz = 0;
pc->data = NULL;
printf("销毁成功\n");
3.8菜单Menu
void Menu()
{
printf("**************************\n");
printf("*** 1.Add 2.Delete ***\n");
printf("*** 3.Search 4.Modify ***\n");
printf("*** 5.Print 6.Sort*******\n");
printf("*** 0.Exit ******\n");
printf("**************************\n");
}
void test()
{
contact con;
Init_contact(&con);//初始化通讯录
int input = 0;
do
{
Menu();
printf("输入你的选择:>\n");
scanf("%d", &input);
switch (input)
{
case Add:
Add_contact(&con);//添加联系人
printf("%d", con.sz);
break;
case Delete:
Delete_contact(&con);//删除联系人
break;
case Search:
Search_contact(&con);//搜索联系人
break;
case Modify:
Modify_contact(&con);//修改联系人
break;
case Print:
Print_contact(&con);//打印联系人
break;
case Sort:
Sort_contact(&con);//排序
break;
case Exit:
Destory_contact(&con);//销毁通讯录
printf("退出\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
}
4.全部代码
contact.h
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#define SIZE 3
#define NAME 20
#define SEX 5
#define TELE 14
#define ADRESS 30
typedef struct PeoInfo
{
char name[NAME];
int age;
char sex[SEX];
char tele[TELE];
char adress[ADRESS];
}PeoInfo;
typedef struct contact
{
int sz;
PeoInfo* data;
int contact;
}contact;
enum
{
Exit,
Add,
Delete,
Search,
Modify,
Print,
Sort,
};
void Init_contact(contact* pc);
void Add_contact(contact* pc);
void Delete_contact(contact* pc);
void Search_contact(contact* pc);
void Modify_contact(contact* pc);
void Print_contact(contact* pc);
void Sort_contact(contact* pc);
void Destory_contact(contact* pc);
contact.c
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
void Init_contact(contact* pc)
{
pc->sz = 0;
pc->contact = SIZE;
pc->data = (PeoInfo*)malloc(pc->contact * sizeof(PeoInfo));
if (pc->data == NULL)
{
perror(malloc);
}
memset(pc->data, 0, pc->contact * sizeof(PeoInfo));
}
void Increase_contact(contact* pc)
{
if (pc->sz == pc->contact)
{
PeoInfo* tmp = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo) * (pc->contact + 2));
if (tmp == NULL)
{
perror(tmp);
return;
}
else
{
pc->data = tmp;
}
pc->contact += 2;
printf("增容成功\n");
}
}
void Add_contact(contact* pc)//添加联系人
{
/*if (pc->sz == MAX)
{
printf("通讯录已满,添加失败\n");
}*/
Increase_contact(pc);
printf("请输入名字\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别\n");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄\n");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入地址\n");
scanf("%s", pc->data[pc->sz].adress);
printf("请输入电话\n");
scanf("%s", pc->data[pc->sz].tele);
pc->sz++;
printf("添加成功\n");
}
int Is_by_name(contact* pc, char name[])//查找要的联系人
{
for (int i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
void Delete_contact(contact* pc)
{
printf("输入要删除联系人的名字:>\n");
char name[20];
scanf("%s", name);
int len=Is_by_name(pc, name);
if (pc->sz == 0)
{
printf("通讯录已空无法删除\n");
return;
}
if (len == -1)
{
printf("查无此人\n");
return;
}
else
{
for (int i = len; i < pc->sz; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功\n");
}
}
void Search_contact(contact* pc)
{
assert(pc);
char name[20];
printf("输入你要查找的联系人的名字\n");
scanf("%s", name);
int ret = Is_by_name(pc, name);
if (-1 == ret)
{
printf("查无此人\n");
return;
}
else
{
printf("%10s\t%4s\t%5s\t%12s\t%20s\n", "姓名", "性别", "年龄", "电话", "住址");
printf("%10s\t%4s\t%5d\t%12s\t%20s\n",
pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].tele,
pc->data[ret].adress);
}
return;
}
void Modify_contact(contact* pc)
{
printf("输入需要修改的联系人:>\n;");
char name[20];
scanf("%s", name);
int len=Is_by_name(pc, name);
rintf("请输入名字:>\n");
scanf("%s", pc->data[len].name );
printf("请输入性别:>\n");
scanf("%s", pc->data [len].sex );
printf("请输入年龄:>\n");
scanf("%d", &pc->data[len].age );
printf("请输入电话:>\n");
scanf("%s", pc->data[len].tele );
printf("请输入住址:>\n");
scanf("%s", pc->data ->adress );
printf("修改成功\n");
}
void Print_contact(contact* pc)
{
printf(" % 10s\t % 4s\t % 5s\t % 12s\t % 20s\n", "姓名", "性别", "年龄", "电话", "住址");
for (int i = 0; i < pc->sz; i++)
{
printf(" % 10s\t % 4s\t % 5d\t % 12s\t % 20s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].adress);
}
}
int cmp_by_name(const void* e1, const void* e2)
{
return strcmp((const char*)e1, (const char*)e2);
}
void Sort_contact(contact* pc)
{
qsort(pc->data->name , pc->sz, sizeof(PeoInfo), cmp_by_name);
}
void Destory_contact(contact* pc)
{
free(pc);
pc->contact = 0;
pc->sz = 0;
pc->data = NULL;
printf("销毁成功\n");
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
void Menu()
{
printf("**************************\n");
printf("*** 1.Add 2.Delete ***\n");
printf("*** 3.Search 4.Modify ***\n");
printf("*** 5.Print 6.Sort*******\n");
printf("*** 0.Exit ******\n");
printf("**************************\n");
}
void test()
{
contact con;
Init_contact(&con);//初始化通讯录
int input = 0;
do
{
Menu();
printf("输入你的选择:>\n");
scanf("%d", &input);
switch (input)
{
case Add:
Add_contact(&con);//添加联系人
printf("%d", con.sz);
break;
case Delete:
Delete_contact(&con);//删除联系人
break;
case Search:
Search_contact(&con);//搜索联系人
break;
case Modify:
Modify_contact(&con);//修改联系人
break;
case Print:
Print_contact(&con);//打印联系人
break;
case Sort:
Sort_contact(&con);//排序
break;
case Exit:
Destory_contact(&con);//销毁通讯录
printf("退出\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}