终极版–增删改查 排序 动态开辟内存 文件存储
addressbook.h
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<assert.h>
#include<string.h>
#define DEFAULT_SZ 3
#define DEFAULT_INC 5
typedef struct people
{
char name[
20];
char sex[
5];
int age;
char tel[
11];
char address[
50];
}peo;
typedef struct LinkMan
{
peo *pcon;
size_t size;
size_t capacity;
}linkman;
void AddressBookInit(linkman* Plink);
void AddInformation(linkman* Plink);
void DeleteInformation(linkman* Plink);
void FindInformation(linkman* Plink);
void AmendInformation(linkman* Plink);
void ShowInformation(linkman* Plink);
void EmptyInformation(linkman* Plink);
void AddressBookSort(linkman* Plink);
void Dilatation(linkman* Plink);
int Find(linkman* Plink,
char* name);
void AddressBookSortAsc(linkman* Plink,
int(*cmp)(
int*,
int*));
int AgeSortAsc(
int* a1,
int* a2);
int AgeSortDes(
int* a1,
int* a2);
addressbook.c
#include"addressbook.h"
void AddressBookInit(linkman* Plink)
{
assert(Plink);
Plink->pcon = (peo*)
malloc(DEFAULT_SZ*
sizeof(peo));
if(Plink->pcon == NULL)
{
perror(
"malloc error\n");
exit(EXIT_FAILURE);
}
memset(Plink->pcon,
0, DEFAULT_SZ*
sizeof(peo));
Plink->size =
0;
Plink->capacity = DEFAULT_SZ;
}
void Dilatation(linkman* Plink)
{
peo* ptr = NULL;
if(Plink->size == Plink->capacity)
{
ptr = (peo*)realloc(Plink->pcon, (Plink->size + DEFAULT_INC)*
sizeof(peo));
if(ptr == NULL)
{
perror(
"realloc error\n");
return;
}
else
{
Plink->pcon = ptr;
Plink->capacity = Plink->capacity + DEFAULT_INC;
}
}
}
void AddInformation(linkman* Plink)
{
assert(Plink);
printf(
"=====%s=====\n", __FUNCTION__);
Dilatation(Plink);
printf(
"\n请输入联系人信息=>\n");
printf(
"姓名:");
scanf(
"%s", Plink->pcon[Plink->size].name);
printf(
"性别:");
scanf(
"%s", Plink->pcon[Plink->size].sex);
printf(
"年龄:");
scanf(
"%d", &Plink->pcon[Plink->size].age);
printf(
"电话:");
scanf(
"%s", Plink->pcon[Plink->size].tel);
printf(
"地址:");
scanf(
"%s", Plink->pcon[Plink->size].address);
Plink->size++;
}
void DeleteInformation(linkman* Plink)
{
printf(
"=====%s=====\n", __FUNCTION__);
assert(Plink);
char name[
20];
printf(
"请输入要删除的联系人姓名=>");
scanf(
"%s", &name);
int ret = Find(Plink, name);
if(ret >=
0)
{
char flag1;
printf(
"确认要删除吗?[y/n] => ");
scanf(
"%s", &flag1);
if(flag1 ==
'y')
{
if(Plink->size ==
1)
{
Plink->size--;
}
else
{
for(size_t j=ret; j<Plink->size-
1; j++)
{
Plink->pcon[j] = Plink->pcon[j+
1];
}
Plink->size--;
}
printf(
"删除成功\n");
}
else
printf(
"没有删除\n");
}
}
int Find(linkman* Plink,
char* name)
{
printf(
"=====%s=====\n", __FUNCTION__);
assert(Plink);
size_t k =
0;
for(; k<=Plink->size; k++)
{
if(
strcmp(Plink->pcon[k].name, name) ==
0)
{
printf(
"姓名:%s\n", Plink->pcon[k].name);
printf(
"性别:%s\n", Plink->pcon[k].sex);
printf(
"年龄:%d\n", &Plink->pcon[k].age);
printf(
"电话:%s\n", Plink->pcon[k].tel);
printf(
"地址:%s\n", Plink->pcon[k].address);
return k;
}
}
printf(
"此人不存在\n");
return -
1;
}
void FindInformation(linkman* Plink)
{
printf(
"=====%s=====\n", __FUNCTION__);
assert(Plink);
char name[
20];
printf(
"请输入要查找的联系人姓名=>");
scanf(
"%s", &name);
size_t k =
0;
int flag22 =
0;
for(; k<=Plink->size; k++)
{
if(
strcmp(Plink->pcon[k].name, name) ==
0)
{
flag22 =
1;
printf(
"姓名:%s\n", Plink->pcon[k].name);
printf(
"性别:%s\n", Plink->pcon[k].sex);
printf(
"年龄:%d\n", &Plink->pcon[k].age);
printf(
"电话:%s\n", Plink->pcon[k].tel);
printf(
"地址:%s\n", Plink->pcon[k].address);
}
}
if(flag22 !=
1)
{
printf(
"此人不存在\n");
}
}
void AmendInformation(linkman* Plink)
{
printf(
"=====%s=====\n", __FUNCTION__);
assert(Plink);
if(Plink->size ==
0)
{
printf(
"联系人列表为空\n");
return;
}
char name[
20];
printf(
"请输入要修改的联系人姓名=>");
scanf(
"%s", &name);
int l = Find(Plink, name);
printf(
"请修改=>\n");
printf(
"姓名:");
scanf(
"%s", Plink->pcon[l].name);
printf(
"性别:");
scanf(
"%s", Plink->pcon[l].sex);
printf(
"年龄:");
scanf(
"%d", &Plink->pcon[l].age);
printf(
"电话:");
scanf(
"%s", Plink->pcon[l].tel);
printf(
"地址:");
scanf(
"%s", Plink->pcon[l].address);
printf(
"修改成功\n");
}
void ShowInformation(linkman* Plink)
{
printf(
"=====%s=====\n", __FUNCTION__);
assert(Plink);
if(Plink->size ==
0)
{
printf(
"联系人列表为空\n");
return;
}
printf(
"姓名 性别 年龄 电话 地址\n");
for(size_t m=
0; m<Plink->size; m++)
{
printf(
"%-6s ",Plink->pcon[m].name);
printf(
"%-6s ",Plink->pcon[m].sex);
printf(
"%-6d ",Plink->pcon[m].age);
printf(
"%-6s ",Plink->pcon[m].tel);
printf(
"%-6s ",Plink->pcon[m].address);
printf(
"\n");
}
}
void EmptyInformation(linkman* Plink)
{
printf(
"=====%s=====\n", __FUNCTION__);
if(Plink->size ==
0)
{
printf(
"联系人列表已经为空\n");
return;
}
else
{
Plink->size =
0;
}
if(Plink->pcon != NULL)
{
free(Plink->pcon);
Plink->pcon = NULL;
printf(
"清空成功\n");
}
else
printf(
"已经为空\n");
}
int NameSort(
char* n1,
char* n2)
{
return (n1 > n2) ?
1 :
0;
}
int AgeSortAsc(
int* a1,
int* a2)
{
printf(
"=====%s=====\n", __FUNCTION__);
if(*a1 > *a2)
return 1;
else
return 0;
}
int AgeSortDes(
int* a1,
int* a2)
{
printf(
"=====%s=====\n", __FUNCTION__);
if(*a1 < *a2)
return 1;
else
return 0;
}
void AddressBookSortAsc(linkman* Plink,
int(*cmp)())
{
printf(
"=====%s=====\n", __FUNCTION__);
assert(Plink);
if(Plink->size ==
0)
{
printf(
"联系人列表为空\n");
return;
}
for(size_t n=
0; n<Plink->size; n++)
{
for(size_t o=
0; o<Plink->size-n-
1; o++)
{
if(cmp(&Plink->pcon[o].age, &Plink->pcon[o+
1].age))
{
struct people tmp = Plink->pcon[o];
Plink->pcon[o] = Plink->pcon[o+
1];
Plink->pcon[o+
1] = tmp;
}
}
}
printf(
"排序完成\n");
ShowInformation(Plink);
}
main.c
#include"addressbook.h"
void SaveFile(linkman* Plink)
{
FILE* p_file = fopen(
"addressbook.txt",
"a+");
char s[] =
"姓名 性别 年龄 电话 地址";
if(p_file != NULL)
{
fprintf(p_file,
"%s\n", &s);
for(
int i=
0; i<Plink->size; i++)
{
fprintf( p_file,
"%-9s ", &Plink->pcon[i].name);
fprintf( p_file,
"%-9s ", &Plink->pcon[i].sex);
fprintf( p_file,
"%-9d ", Plink->pcon[i].age);
fprintf( p_file,
"%-9s ", &Plink->pcon[i].tel);
fprintf( p_file,
"%-9s \n", &Plink->pcon[i].address);
}
}
fclose(p_file);
p_file = NULL;
}
int main()
{
linkman MyLinkMan;
AddressBookInit(&MyLinkMan);
while(
1)
{
int n =
0;
printf(
"===================================\n");
printf(
"1:添加 2:删除 3:查找 4:修改\n");
printf(
"5:显示 8:清空 7:升序 8:降序\n");
printf(
"0:保存并退出\n");
printf(
"===================================\n");
printf(
"请输入=>");
scanf(
"%d", &n);
if(n>=
0 && n<=
8)
{
switch(n)
{
case 1:AddInformation(&MyLinkMan);
break;
case 2:DeleteInformation(&MyLinkMan);
break;
case 3:FindInformation(&MyLinkMan);
break;
case 4:AmendInformation(&MyLinkMan);
break;
case 5:ShowInformation(&MyLinkMan);
break;
case 6:EmptyInformation(&MyLinkMan);
break;
case 7:AddressBookSortAsc(&MyLinkMan, AgeSortAsc);
break;
case 8:AddressBookSortAsc(&MyLinkMan, AgeSortDes);
break;
case 0:
printf(
"再见!\n");
SaveFile(&MyLinkMan);
exit(
1);
}
}
else
{
printf(
"输入有误,请重输\n");
continue;
}
}
return 0;
}