用c语言实现一个通讯录功能,包含增删查改这些功能其中创建了三个文件
用来创建出框架和创建函数,用来实现函数,用来声明这些函数;
好,那么接下来就开始实现:
:源文件创建函数和创建框架
#define _CRT_SECURE_NO_WARNINGS
#include ""
void menu()
{
printf(" \n");
printf(" 增加 删除 \n");
printf(" 查找 修改 \n");
printf(" 显示 排序 \n");
printf(" 保存 \n");
printf(" 退出 \n");
printf(" \n");
}
int main()
{
int input = 0;
//创建通讯录
struct contact con;//;里面包含存放信息和size,capacity
//初始化通讯录
initcontact(&con);
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch(input)
{
case add:
addcontact(&con);
break;
case del:
delecontact(&con);
break;
case search:
searchcontact(&con);
break;
case modipy:
modipyconntact(&con);
break;
case show:
showcontact(&con);
break;
case sort:
sortcontact(&con);
break;
case exita:
savecontact(&con);
destorycontact(&con);//因为是动态内存开辟的内存需要释放
printf("退出通讯录\n");
break;
case save:
savecontact(&con);
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
:源文件,实现函数功能,也是这个程序最主要的部分
#define _CRT_SECURE_NO_WARNINGS
#include""
//初始化通讯录
void initcontact(struct contact* ps)
{
ps->data = (struct peoinof*)malloc(defaule*sizeof(struct peoinfo));
if (ps->data == NULL)
{
return;
}
ps->size = 0;
ps->capacity = defaule;
//把文件中已经存放在通讯录中的信息加载到通讯录中
loadcontact(ps);
}
//增容函数声明
void checkcapacity(struct contact* ps);//这个函数是在后面定义的,要在前面声明一下
void loadcontact(contact* ps)
{
peoinfo tmp = { 0 };
FILE* pfread = fopen("", "rb");//打开文件
if (pfread == NULL)
{
printf("loadcontact:%s\n", strerror(errno));
return;
}
//读取文件存放到通讯录中
while (fread(&tmp, sizeof(peoinfo), 1, pfread))//返回值为0说明读取完了跳出
{
checkcapacity(ps);//当读取时内存不够,增容,因为前面给设置了3
ps->data[ps->size] = tmp;//存放在size的下标处
ps->size++;
}
//关闭文件
fclose(pfread);
pfread = NULL;
}
void checkcapacity(struct contact* ps)
{
if (ps->size == ps->capacity)
{
//满了,增容
struct pepoleinf*ptr=realloc(ps->data, (ps->capacity + 2) * sizeof(peoinfo));
if (ptr != NULL)
{
ps->data = ptr;
ps->capacity += 2;
printf("增容成功\n");
}
else
{
printf("增容失败\n");
}
}
}
//添加信息
void addcontact(struct contact* ps)
{
checkcapacity(ps);//检测当前容量
printf("请输入名字:");
scanf("%s", ps->data[ps->size].name);
printf("请输入年龄:");
scanf("%d", &(ps->data[ps->size].age));
printf("请输入性别:");
scanf("%s", ps->data[ps->size].sex);
printf("请输入电话:");
scanf("%s", ps->data[ps->size].tele);
printf("请输入地址:");
scanf("%s", ps->data[ps->size].addr);
ps->size++;//录入一个结构之后,size加1
printf("添加成功\n");
// if (ps->size == max)
// {
// printf("通讯录已满,无法增加\n");
// }
// else
// {
// printf("请输入名字:");
// scanf("%s", ps->data[ps->size].name);
// printf("请输入年龄:");
// scanf("%d", &(ps->data[ps->size].age));
// printf("请输入性别:");
// scanf("%s", ps->data[ps->size].sex);
// printf("请输入电话:");
// scanf("%s", ps->data[ps->size].tele);
// printf("请输入地址:");
// scanf("%s", ps->data[ps->size].addr);
//
// ps->size++;//录入一个结构之后,size加1
// printf("添加成功\n");
// }
}
//打印显示出来通讯录内容
void showcontact(const struct contact* ps)
{
if (ps->size == 0)
{
printf("通讯录为空\n");
}
else
{
int i = 0;
//标题
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字","年龄","性别","电话","地址");
//内容
for (i = 0; i < ps->size; i++)
{
printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
ps->data[i].name,
ps->data[i].age,
ps->data[i].sex,
ps->data[i].tele,
ps->data[i].addr);
}
}
}
//定义的一个查找通讯录指定姓名的人的信息
//查找函数
//stctic加上这个代表这个函数只可以在这个源文件内部使用,外面不会显示,不暴露出去内部才能看见
static int findbyname(const struct contact* ps,char name[max_name])
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (0 == strcmp(ps->data[i].name, name))//字符串比较相等
{
return i;//找到返回1
}
}
return -1;//找不到返回-1
}
//删除
void delecontact(struct contact* ps)
{
char name[max_name];
printf("请输入要删除人的名字:");
scanf("%s", &name);
//1.查找要删除人的位置
int pos = findbyname(ps,name);//查找函数
//删除
if (pos==-1)
{
printf("要删除的人不存在\n");
}
else
{
//删除数据
int j = 0;
for (j = pos; j < ps->size - 1; j++)
{
ps->data[j] = ps->data[j + 1];//将后一个人的信息覆盖掉前面这个人++
}
ps->size--;//通讯录人数--
printf("删除成功\n");
}
}
//查找显示指定人姓名的信息内容
void searchcontact(const struct contact* ps)
{
char name[max_name];
printf("请输入要查找人的姓名:");
scanf("%s", &name);
int pos = findbyname(ps, name);//查找函数
if (pos == -1)
{
printf("要查找的人不存在\n");
}
else
//打印显示出来
{
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
ps->data[pos].name,
ps->data[pos].age,
ps->data[pos].sex,
ps->data[pos].tele,
ps->data[pos].addr);
}
}
//修改联系人
void modipyconntact(struct contact* ps)
{
char name[max_name];
printf("请输入你要修改的联系人姓名:");
scanf("%s", &name);
int pos=findbyname(ps, name);
if (pos == -1)
{
printf("要修改人的信息不存在\n");
}
else
{
//修改代表重新输入一个人的信息
printf("请输入名字:");
scanf("%s", ps->data[pos].name);//替换
printf("请输入年龄:");
scanf("%d", &(ps->data[pos].age));
printf("请输入性别:");
scanf("%s", ps->data[pos].sex);
printf("请输入电话:");
scanf("%s", ps->data[pos].tele);
printf("请输入地址:");
scanf("%s", ps->data[pos].addr);
printf("修改完成\n");
}
}
//释放空间
void destorycontact(contact* ps)
{
free(ps->data);
ps->data = NULL;
}
//保存文件
void savecontact(contact* ps)
{
FILE* pfwrite = fopen("", "wb");//打开文件
if (pfwrite == NULL)
{
printf("savecontact:%s ", strerror(errno));
return;//因为是void返回无返回值
}
//写通讯录中的数据到文件中
int i = 0;
for (i = 0; i < ps->size; i++)
{
//写文件函数,地址 //元素大小,一次写几个 ,流
fwrite(&(ps->data[i]), sizeof(peoinfo), 1, pfwrite);
}
printf("保存成功\n");
//关闭文件
fclose(pfwrite);
pfwrite = NULL;
}
//排序
void sortcontact(struct contact* ps)
{
int i = 0;
for (i = 0; i < ps->size - 1; i++)
{
for (int j = 0; j < ps->size - i-1; j++)
{
if (ps->data[j].age > ps->data[j+1].age)
{
//交换
peoinfo tmp;
tmp = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = tmp;
}
}
}
printf("排序成功");
}
:头文件,函数的声明以及结构体的创建
#define _CRT_SECURE_NO_WARNINGS
#include<>
#include<>
#include<>
#include<>
enum option//枚举
{
exita,//0
add,//1
del,
search,
modipy,
show,
sort,
save
};
//#define max 1000
#define defaule 3
#define max_name 20
#define max_sex 5
#define max_tele 16
#define max_addr 40
typedef struct peoinfo
{
char name[max_name];//名字
int age;//年龄
char sex[max_sex];//性别
char tele[max_tele];//电话
char addr[max_addr];//住址
}peoinfo;//typedef将类型名单独变成peoinfo
typedef struct contact
{
struct peoinfo *data;//存放信息
int size;//记录当前已经有的元素个数
int capacity;
}contact;
//声明函数
//初始化通讯录
void initcontact(struct contact* ps);
//添加一个信息到通讯录
void addcontact(struct contact* ps);
//打印通讯录中的信息
void showcontact(const struct contact* ps);
//删除指定的联系人
void delecontact(struct contact* ps);
//查找指定人的信息
void searchcontact(struct contact* ps);
//修改指定联系人
void modipyconntact(struct contact* ps);
//释放空间
void destorycontact(contact* ps);
//保存文件
void savecontact(contact* ps);
//加载文件中的信息到通讯录
void loadcontact(contact* ps);
//排序
void sortcontact(struct contact* ps);
以上便是这个程序的实现