在结构体这一块,有普遍应用的就是通讯录这一个功能的简单实现。一开始首先定义两个结构体:
这个结构体存放通讯录信息
typedef struct AddressInfo
{
char _name[24];
char _tel[24];
int _age;
enum SEX _sex;
}AddressInfo;
这个结构体存放通讯录的通讯人数量,容量以及指向通讯录信息的指针(有容量是因为在通讯录满了之后可以动态开辟)
typedef struct AddressBook
{
AddressInfo* _AIArray;
size_t _size;
size_t _capacity;
}AddressBook;
其中性别这一栏可以自己定义,也可以枚举。
enum SEX
{
Man,
Woman,
};
接下来开始各个接口的实现:
void AddressBookInit(AddressBook* pbook);
void AddressBookInit(AddressBook* pbook)
{
assert(pbook);
pbook->_size = 0;
pbook->_capacity = 2;
pbook->_AIArray = (AddressInfo*)malloc(sizeof(AddressInfo)* 2);
assert(pbook->_AIArray);
}//该接口是初始化通讯录,首先给了2个存储空间,如果已满就malloc扩容空间,动态扩容我以后也会写一篇博客来简单介绍一下
void AddressBookDestroy(AddressBook* pbook);
void AddressBookDestroy(AddressBook* pbook)
{
assert(pbook);
free(pbook->_AIArray);
pbook->_AIArray = NULL;
pbook->_size = pbook->_capacity = 0;
}//该接口是将通讯录置为空的操作
void AddressBookAdd(AddressBook* pbook, AddressInfo* pinfo);
void AddressBookAdd(AddressBook* pbook, AddressInfo* pinfo)
{
assert(pbook);
if (pbook->_size == pbook->_capacity)
{
pbook->_AIArray = realloc(pbook->_AIArray, pbook->_capacity * 2 * sizeof(AddressInfo));
pbook->_capacity *= 2;
}
strcpy(pbook->_AIArray[pbook->_size]._name, pinfo->_name);
strcpy(pbook->_AIArray[pbook->_size]._tel, pinfo->_tel);
pbook->_AIArray[pbook->_size]._age = pinfo->_age;
pbook->_AIArray[pbook->_size]._sex = pinfo->_sex;
pbook->_size++;
}//添加通讯人信息的接口
void AddressBookDel(AddressBook* pbook, const char* name);
void AddressBookDel(AddressBook* pbook, const char* name)
{
for (size_t i = 0; i < pbook->_size; ++i)
{
if (strcmp(pbook->_AIArray[i]._name, name) == 0)
{
while (i < pbook->_size - 1)
{
strcpy(pbook->_AIArray[i]._name, pbook->_AIArray[i + 1]._name);
strcpy(pbook->_AIArray[i]._tel, pbook->_AIArray[i + 1]._tel);
pbook->_AIArray[i]._age = pbook->_AIArray[i + 1]._age;
pbook->_AIArray[i]._sex = pbook->_AIArray[i + 1]._sex;
++i;
}
pbook->_size--;
break;
}
}
}
//删除操作
AddressInfo* AddressBookFind(AddressBook* pbook, const char* name);
AddressInfo* AddressBookFind(AddressBook* pbook, const char* name)
{
assert(pbook);
for (size_t i = 0; i < pbook->_size; ++i)
{
if (strcmp(pbook->_AIArray[i]._name,name) == 0)
{
return &pbook->_AIArray[i];
}
}
return NULL;
}
//查找操作
void AddressBookSave(AddressBook* pbook, const char* filename);
void AddressBookSave(AddressBook* pbook, const char* filename)
{
assert(pbook);
FILE* fp = fopen(filename, "w");
for (size_t i = 0; i < pbook->_size; ++i)
{
fputs(pbook->_AIArray[i]._name, fp);
fputc('\n', fp);
fputs(pbook->_AIArray[i]._tel, fp);
fputc('\n', fp);
char agestr[20];
itoa(pbook->_AIArray[i]._age, agestr, 10);
fputs(agestr, fp);
fputc('\n', fp);
fprintf(fp, "%s %s %d\n", pbook->_AIArray[i]._name, pbook->_AIArray[i]._tel, pbook->_AIArray[i]._age);
}
AddressInfo end;
fprintf(fp, "%s %s %d\n", "**", "**", -1);
}
//这个是存储在文件中的接口实现,因为一般我们对于程序的实现都是在编译器中的控制面板中看到的,在这个接口可以直接在文件中看到我所存储的通讯录信息。
void AddressBookLoad(AddressBook* pbook, const char* filename);
void AddressBookLoad(AddressBook* pbook, const char* filename)
{
assert(pbook);
FILE* fp = fopen(filename, "r");
AddressInfo info;
while (1)
{
info._name[0] = '\0';
info._tel[0] = '\0';
info._age = 0;
fscanf(fp, "%s%s%d", info._name, info._tel, &info._age);
if (info._age == -1)
{
break;
}
else
{
AddressBookAdd(pbook, &info);
}
}
}
//这个接口是重载通讯录的实现,在经历过add,del,save,find这些接口实现过后,这个接口就是重载通讯录,让客户能够看到变化。
void AddressBookPrint(AddressBook* pbook);
void AddressBookPrint(AddressBook* pbook)
{
assert(pbook);
for (size_t i = 0; i < pbook->_size; ++i)
{
//printf("======================================\n");
printf("name:%s ", pbook->_AIArray[i]._name);
printf("tel:%s ", pbook->_AIArray[i]._tel);
printf("age:%d ", pbook->_AIArray[i]._age);
printf("sex:%d ", pbook->_AIArray[i]._sex);
printf("\n");
}
//printf("======================================\n");
}
//该接口是打印通讯录信息
以上就是几大接口的的实现,接下来就是对这几个接口进行测试的代码:
void TestAddressBook()
{
AddressBook addressbook;
AddressBookInit(&addressbook);
AddressInfo info1 = {"安南是hp", "18213141414", 18, Man};
AddressBookAdd(&addressbook, &info1);
AddressInfo info2 = { "王晓", "18213141415", 19, Man };
AddressBookAdd(&addressbook, &info2);
AddressInfo info3 = { "李娜", "18213141416", 19, Man };
AddressBookAdd(&addressbook, &info3);
AddressBookSave(&addressbook, "addressfile.txt");
AddressBookPrint(&addressbook);
AddressBookLoad(&addressbook, "addressfile.txt");
AddressBookPrint(&addressbook);
AddressInfo* ret = AddressBookFind(&addressbook, "王晓");
printf("%s\n", ret->_name);
AddressBookDel(&addressbook, "王晓");
AddressBookPrint(&addressbook);
AddressBookSave(&addressbook, "addressfile.bin");
AddressBookDestroy(&addressbook);
}
//首先给出几个通讯录的测试用例
在测试用例给出之后,构造主函数,在主函数里面设计你想要的打印风格以及你想让各大接口实现的安排。
int main()
{
AddressBook addressbook;
AddressBookInit(&addressbook);
AddressBookLoad(&addressbook, "addressfile.bin");
int option = 0;
do{
printf("=========================================\n");
printf("1.添加通讯录信息 2.查找通讯录信息\n");
printf("3.删除通讯录信息 4.修改通讯录信息\n");
printf("5.保存通讯录到文件 6.读取文件通讯录信息\n");
printf("7.打印通讯录信息 -1.退出.\n");
scanf("%d", &option);
if (option == 1)
{
printf("请依次输入姓名、电话、年龄、性别:\n");
AddressInfo info;
scanf("%s", info._name);
scanf("%s", info._tel);
scanf("%d", &info._age);
char sex[10];
scanf("%s", sex);
if (strcmp(sex, "男") == 0)
info._sex = 0;
else
info._sex = 1;
AddressBookAdd(&addressbook, &info);
}
else if (option == 2)
{
char name[20];
printf("请输入要查找联系人的姓名\n");
scanf("%s", name);
AddressInfo* ret = AddressBookFind(&addressbook, name);
if (ret == NULL)
{
printf("查无此人\n");
}
else
{
printf("姓名:%s\n", ret->_name);
printf("电话:%s\n", ret->_tel);
printf("年龄:%d\n", ret->_age);
printf("性别:%d\n", ret->_sex);
}
}
else if (option == 4)
{
char name[20];
printf("请输入要修改联系人的姓名\n");
scanf("%s", name);
AddressInfo* ret = AddressBookFind(&addressbook, name);
if (ret == NULL)
{
printf("查无此人\n");
}
else
{
printf("请输入要修改联系人的电话\n");
scanf("%s", ret->_tel);
}
}
else if (option == 5)
{
AddressBookSave(&addressbook, "addressfile.bin");
}
else if (option == 6)
{
addressbook._size = 0;
AddressBookLoad(&addressbook, "addressfile.bin");
}
else if (option == 7)
{
AddressBookPrint(&addressbook);
}
printf("=========================================\n");
} while (option >= 0);
return 0;
}
以上就是这个通讯录实现的全部过程,当然在这之前也得引入头文件:
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
以上就是我的全部内容,附上完整代码:
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
enum SEX
{
Man,
Woman,
};
typedef struct AddressInfo
{
char _name[24];
char _tel[24];
int _age;
enum SEX _sex;
}AddressInfo;
typedef struct AddressBook
{
AddressInfo* _AIArray;
size_t _size;
size_t _capacity;
}AddressBook;
void AddressBookInit(AddressBook* pbook);
void AddressBookDestroy(AddressBook* pbook);
void AddressBookAdd(AddressBook* pbook, AddressInfo* pinfo);
void AddressBookDel(AddressBook* pbook, const char* name);
AddressInfo* AddressBookFind(AddressBook* pbook, const char* name);
void AddressBookSave(AddressBook* pbook, const char* filename);
void AddressBookLoad(AddressBook* pbook, const char* filename);
void AddressBookPrint(AddressBook* pbook);
#include "AddressBook.h"
void AddressBookInit(AddressBook* pbook)
{
assert(pbook);
pbook->_size = 0;
pbook->_capacity = 2;
pbook->_AIArray = (AddressInfo*)malloc(sizeof(AddressInfo)* 2);
assert(pbook->_AIArray);
}
void AddressBookDestroy(AddressBook* pbook)
{
assert(pbook);
free(pbook->_AIArray);
pbook->_AIArray = NULL;
pbook->_size = pbook->_capacity = 0;
}
void AddressBookAdd(AddressBook* pbook, AddressInfo* pinfo)
{
assert(pbook);
if (pbook->_size == pbook->_capacity)
{
pbook->_AIArray = realloc(pbook->_AIArray, pbook->_capacity * 2 * sizeof(AddressInfo));
pbook->_capacity *= 2;
}
strcpy(pbook->_AIArray[pbook->_size]._name, pinfo->_name);
strcpy(pbook->_AIArray[pbook->_size]._tel, pinfo->_tel);
pbook->_AIArray[pbook->_size]._age = pinfo->_age;
pbook->_AIArray[pbook->_size]._sex = pinfo->_sex;
pbook->_size++;
}
void AddressBookSave(AddressBook* pbook, const char* filename)
{
assert(pbook);
FILE* fp = fopen(filename, "w");
for (size_t i = 0; i < pbook->_size; ++i)
{
fputs(pbook->_AIArray[i]._name, fp);
fputc('\n', fp);
fputs(pbook->_AIArray[i]._tel, fp);
fputc('\n', fp);
char agestr[20];
itoa(pbook->_AIArray[i]._age, agestr, 10);
fputs(agestr, fp);
fputc('\n', fp);
fprintf(fp, "%s %s %d\n", pbook->_AIArray[i]._name, pbook->_AIArray[i]._tel, pbook->_AIArray[i]._age);
}
AddressInfo end;
fprintf(fp, "%s %s %d\n", "**", "**", -1);
void AddressBookLoad(AddressBook* pbook, const char* filename)
{
assert(pbook);
FILE* fp = fopen(filename, "r");
AddressInfo info;
while (1)
{
info._name[0] = '\0';
info._tel[0] = '\0';
info._age = 0;
fscanf(fp, "%s%s%d", info._name, info._tel, &info._age);
if (info._age == -1)
{
break;
}
else
{
AddressBookAdd(pbook, &info);
}
}
}
void AddressBookDel(AddressBook* pbook, const char* name)
{
for (size_t i = 0; i < pbook->_size; ++i)
{
if (strcmp(pbook->_AIArray[i]._name, name) == 0)
{
while (i < pbook->_size - 1)
{
strcpy(pbook->_AIArray[i]._name, pbook->_AIArray[i + 1]._name);
strcpy(pbook->_AIArray[i]._tel, pbook->_AIArray[i + 1]._tel);
pbook->_AIArray[i]._age = pbook->_AIArray[i + 1]._age;
pbook->_AIArray[i]._sex = pbook->_AIArray[i + 1]._sex;
++i;
}
pbook->_size--;
break;
}
}
}
AddressInfo* AddressBookFind(AddressBook* pbook, const char* name)
{
assert(pbook);
for (size_t i = 0; i < pbook->_size; ++i)
{
if (strcmp(pbook->_AIArray[i]._name,name) == 0)
{
return &pbook->_AIArray[i];
}
}
return NULL;
}
void AddressBookPrint(AddressBook* pbook)
{
assert(pbook);
for (size_t i = 0; i < pbook->_size; ++i)
{
//printf("======================================\n");
printf("name:%s ", pbook->_AIArray[i]._name);
printf("tel:%s ", pbook->_AIArray[i]._tel);
printf("age:%d ", pbook->_AIArray[i]._age);
printf("sex:%d ", pbook->_AIArray[i]._sex);
printf("\n");
}
//printf("======================================\n");
#include "AddressBook.h"
void TestAddressBook()
{
AddressBook addressbook;
AddressBookInit(&addressbook);
AddressInfo info1 = {"安南是Hp", "18213141414", 18, Man};
AddressBookAdd(&addressbook, &info1);
AddressInfo info2 = { "王晓", "18213141415", 19, Man };
AddressBookAdd(&addressbook, &info2);
AddressInfo info3 = { "李娜", "18213141416", 19, Man };
AddressBookAdd(&addressbook, &info3);
AddressBookSave(&addressbook, "addressfile.txt");
AddressBookPrint(&addressbook);
AddressBookLoad(&addressbook, "addressfile.txt");
AddressBookPrint(&addressbook);
AddressInfo* ret = AddressBookFind(&addressbook, "王晓");
printf("%s\n", ret->_name);
AddressBookDel(&addressbook, "王晓");
AddressBookPrint(&addressbook);
AddressBookSave(&addressbook, "addressfile.bin");
AddressBookDestroy(&addressbook);
}
int main()
{
AddressBook addressbook;
AddressBookInit(&addressbook);
AddressBookLoad(&addressbook, "addressfile.bin");
int option = 0;
do{
printf("=========================================\n");
printf("1.添加通讯录信息 2.查找通讯录信息\n");
printf("3.删除通讯录信息 4.修改通讯录信息\n");
printf("5.保存通讯录到文件 6.读取文件通讯录信息\n");
printf("7.打印通讯录信息 -1.退出.\n");
scanf("%d", &option);
if (option == 1)
{
printf("请依次输入姓名、电话、年龄、性别:\n");
AddressInfo info;
scanf("%s", info._name);
scanf("%s", info._tel);
scanf("%d", &info._age);
char sex[10];
scanf("%s", sex);
if (strcmp(sex, "男") == 0)
info._sex = 0;
else
info._sex = 1;
AddressBookAdd(&addressbook, &info);
}
else if (option == 2)
{
char name[20];
printf("请输入要查找联系人的姓名\n");
scanf("%s", name);
AddressInfo* ret = AddressBookFind(&addressbook, name);
if (ret == NULL)
{
printf("查无此人\n");
}
else
{
printf("姓名:%s\n", ret->_name);
printf("电话:%s\n", ret->_tel);
printf("年龄:%d\n", ret->_age);
printf("性别:%d\n", ret->_sex);
}
}
else if (option == 4)
{
char name[20];
printf("请输入要修改联系人的姓名\n");
scanf("%s", name);
AddressInfo* ret = AddressBookFind(&addressbook, name);
if (ret == NULL)
{
printf("查无此人\n");
}
else
{
printf("请输入要修改联系人的电话\n");
scanf("%s", ret->_tel);
}
}
else if (option == 5)
{
AddressBookSave(&addressbook, "addressfile.bin");
}
else if (option == 6)
{
addressbook._size = 0;
AddressBookLoad(&addressbook, "addressfile.bin");
}
else if (option == 7)
{
AddressBookPrint(&addressbook);
}
printf("=========================================\n");
} while (option >= 0);
return 0;
}
}
以上就是通讯录内容的全部实现,希望各位大佬多多指正。